Пояснення оператора двокрапки у “: $ {foo = value}”


79

Я розумію оператор двокрапки в bash, який діє як нуль , і знаю, що він використовується для розширення параметрів , а також використовується іншими способами, але хтось може пояснити це:

: ${SOMETHING='value'}

З експериментів я знаю , що це встановлює змінну оточення , $SOMETHINGщоб , 'value'але чому?

"Просто тому, що це робить" - це вірна відповідь, але тоді, будь ласка, вкажіть мені документацію до неї (яку я, здається, не можу знайти), або власне ім'я для цього використання буде корисним. Я сподіваюся, що є більш просвітницьке пояснення.


2
Зверніть увагу, що :вбудований існує в bourne shell і ksh, а також bash.
ghoti

Відповіді:


97

Вираз ${SOMETHING='value'}встановлює НЕЩО, valueякщо він ще не встановлений. Це корисний оператор у багатьох ситуаціях. Однак він також повертає призначене значення, тому якщо ви просто виконали

${SOMETHING='value'}

тоді ваша оболонка спробує викликати команду value. Це може або не може зробити щось небажане; принаймні це викине повідомлення "value: command not found".

Щоб уникнути цього, ви можете використовувати no-op :, який оцінює аргумент, а потім викидає його, а не виконує. Це задокументовано тут .


13
:Команда вбудованої документована тут . Це також стандарт POSIX .
Адам Розенфілд,

3
Також тут пояснено .
x-yuri

2
чи є якась різниця між: $ {SOMETHING = "$ HMMM"} та: $ {SOMETHING: = "$ HMMM"}? зверніть увагу на другу двокрапку в останньому прикладі
Юрій Козлов

3
@YuryKozlov Перший варіант ( =) використовуватиме значення за замовчуванням, якщо параметр є unset; останній ( :=) використовуватиме значення за замовчуванням, якщо параметр - null або unset
Дейв Л.

7

Пояснено тут: http://tldp.org/LDP/abs/html/parameter-substitution.html

Якщо параметр не встановлено, встановіть його за замовчуванням.

Обидві форми майже еквівалентні. Параметр: робить різницю лише тоді, коли параметр $ оголошено і має значення null, [1] як зазначено вище.

echo ${var=abc}   # abc
echo ${var=xyz}   # abc
# $var had already been set to abc, so it did not change.

3
Я б запропонував wiki.bash-hackers.org/syntax/pe або mywiki.wooledge.org/BashFAQ/073 (та його посилання) як кращі посилання, ніж ABS (який хронічно недотримується та має тенденцію демонструвати погані практики в його приклади).
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.