Я не понимаю, что это значит в сценарии оболочки Bash:

MYSET=${*:- "-a"}

Кто-нибудь может объяснить?

0
Kusalananda 3 Апр 2021 в 00:45

1 ответ

Лучший ответ

Расширение параметра ${variable:-value} будет расширено до строки value, если переменная variable не установлена ​​или пуста. Это стандартное расширение параметра, которое не относится к оболочке bash, но работает во всех POSIX-совместимых оболочках.

Специальная переменная $* представляет собой строку, состоящую из позиционных параметров, соединенных с первым символом $IFS (по умолчанию пробел) в качестве разделителя. Позиционные параметры — это аргументы, передаваемые сценарию или функции оболочки, либо они устанавливаются с помощью утилиты set, то есть значения $1, $2, $3, и т. д. Это тоже не зависит от bash.

Ваша команда устанавливает переменную MYSET в $* (скорее всего, аргументы командной строки, переданные сценарию, с пробелами между ними), если это значение не пусто, и в этом случае MYSET будет установлено в -a с начальным пробелом. Кавычки вокруг -a не имеют значения в данном конкретном случае.

Пример кода в командной строке:

$ set --
$ MYSET=${*:- "-a"}; printf '%s\n' "$MYSET"
 -a
$ set -- 1 2 3
$ MYSET=${*:- "-a"}; printf '%s\n' "$MYSET"
1 2 3
5
Kusalananda 3 Апр 2021 в 00:52
Спасибо; а как насчет "${*" ? Почему не "$*"? Почему «» предшествует «{»? В Интернете я нашел "$", а не "${*"
 – 
user1
1 Апр 2021 в 17:47
Многие из более сложных расширений оболочки были бы неоднозначными, если бы они не были обозначены фигурными скобками. Даже $foo1 может быть неоднозначным: если вы объявили foo=36, вы можете ожидать, что $foo1 будет 361. Но он ищет переменную с именем foo1. Вам нужно ${foo}1.
 – 
Paul_Pedant
1 Апр 2021 в 18:04
«Интернет» часто ошибается — на самом деле, вы можете найти все возможные неправильные и правильные ответы. Что вообще не является ответом. https://www.gnu.org/software/bash/manual/bash.html является полномочным.
 – 
Paul_Pedant
1 Апр 2021 в 18:07
${*:- "-a"} совпадает с ${variable:-value}, но variable заменено на *, а value заменено на "-a". Расширение ${variable:-value} — это стандартное расширение, которое расширяется до $variable, если это значение не пусто, и до строки value, если $variable пусто. Бит ${* оказывается первыми тремя символами кода ${*:- "-a"}. $* будет именно так, то есть $*, независимо от того, пустое это значение или нет. Здесь разработчик, очевидно, хотел предоставить значение по умолчанию "-a", если сценарию не были переданы никакие аргументы. Так понятнее?
 – 
Kusalananda
1 Апр 2021 в 18:37