Чтобы ответить на ваш основной вопрос, ${foo} называется «расширение параметра». Чтобы быть точным, сам $ начинает расширение параметра, { } на самом деле необязательны в соответствии с спецификацией POSIX, но могут быть полезны для указания конца имени переменной:
$ foo="bar"
$ echo $fooBaz ## fails, no variable named $fooBaz exists
$ echo ${foo}Baz ## works, $foo is expanded and the string Baz is appended
barBaz
В принципе , $foo и ${foo} идентичны. Помимо случаев, подобных приведенному выше или когда вы выполняете «расширение параметра» , они полностью эквивалентны.
Однако вы не должны использовать ни один из них. Эмпирическое правило состоит в том, что, за очень небольшим исключением, вы всегда должны использовать "$foo" или "${foo}" и никогда $foo или ${foo}. Вы всегда должны указывать свои переменные, чтобы избежать вызова оператора split + glob (подробнее об этом позже). Вы, конечно, не хотите $foo$. Окончательный $ не имеет значения:
$ foo="bar"
$ echo "$foo$"
bar$
Итак, хотя некорректные переменные иногда выглядят нормально:
$ echo $foo
bar
Их обычно нет и их следует избегать: [!d8 ]
$ if [ -n $foo ]; then echo empty; else echo "not empty"; fi ## fails
empty
$ if [ -n "$foo" ]; then echo empty; else echo "not empty"; fi ## works
not empty
Обратите внимание, что скобки здесь не помогают:
$ if [ -n ${foo} ]; then echo empty; else echo "not empty"; fi ## fails
empty
$ if [ -n "${foo}" ]; then echo empty; else echo "not empty"; fi ## works
not empty
Когда вы используете $foo или ${foo}, оболочка будет разделять значение, сохраненное в переменной в пробеле (это можно изменить, установив переменную IFS в нечто другое) в список, а затем каждый элемент списка рассматривается как шаблон glob и расширяется в любые соответствующие файлы или каталоги. Это называется оператором всегда . Чтобы проиллюстрировать, рассмотрите каталог с двумя файлами:
$ ls -l
-rw-r--r-- 1 terdon terdon 0 Oct 9 18:16 file1
-rw-r--r-- 1 terdon terdon 0 Oct 9 18:16 file2
Теперь давайте установим переменную в foo *:
$ foo="foo *"
Что произойдет, если мы попытаемся проверить, файл с этим именем существует?
$ if [ -e $foo ]; then echo "file exists"; else echo "no such file"; fi
file exists
Переменная была разделена на foo и *, а поскольку * является подстановочным знаком, который соответствует любой строке, оболочка сообщает вам, что файл, foo * экксисты. Однако, если мы приводим его правильно, это не происходит:
$ if [ -e "$foo" ]; then echo "file exists"; else echo "no such file"; fi
no such file
Это был тривиальный пример, иллюстрирующий эту точку. Представьте, если бы я использовал rm вместо echo.
Итак, первое правило: split Вы можете использовать либо "$foo", либо "${foo}", но процитировать его в любом случае. Более подробно об использовании переменных безопасно, посмотрите на эти сообщения:
$ VAR vs $ {VAR} и процитировать или не указывать Расширение переменной оболочки и эффект glob и разделение на нее Безопасность последствия забывания процитировать переменную в оболочках bash / POSIX. Почему мне нужно указывать переменную для if, но не для эха?Проблема решена. После добавления OpenPGP все в порядке.
Подробнее о обсуждении https://answers.launchpad.net/launchpad/+question/156588
решена проблема. После добавления моих ключей все ок.
более подробную информацию о дискуссии https://answers.launchpad.net/launchpad/+вопрос/156588
Проблема решена. После добавления OpenPGP все в порядке.
Подробнее о обсуждении https://answers.launchpad.net/launchpad/+question/156588
решена проблема. После добавления моих ключей все ок.
более подробную информацию о дискуссии https://answers.launchpad.net/launchpad/+вопрос/156588
Проблема решена. После добавления OpenPGP все в порядке.
Подробнее о обсуждении https://answers.launchpad.net/launchpad/+question/156588
Проблема решена. После добавления моего OpenPGP все в порядке.
Подробнее о обсуждении https://answers.launchpad.net/launchpad/+question/156588
Проблема решена. После добавления моего OpenPGP все в порядке.
Подробнее о обсуждении https://answers.launchpad.net/launchpad/+question/156588
Проблема решена. После добавления моего OpenPGP все в порядке.
Подробнее о обсуждении https://answers.launchpad.net/launchpad/+question/156588