Какую форму предпочтительнее использовать в Bash? - PullRequest
3 голосов
/ 27 ноября 2011

Я изучаю Bash, и вижу, что форма

C = пример

эхо "$ C"

дает тот же результат в форме

C = "пример"

эхо $ C

Я хотел бы знать, лучше ли ставить "" в присваивании переменной или после $. Или если это безразлично. или если один считается «красивее» другого.

Ответы [ 5 ]

5 голосов
/ 27 ноября 2011

Если вы уверены, что значение переменной - это одно слово (без пробелов), тогда можно использовать $varname или ${varname}. Если вы не можете гарантировать это, вы должны использовать "$varname" или "${varname}". Обратите внимание, что bash выполняет разбиение слов перед интерпретацией вашей команды, поэтому вы можете получить синтаксическую ошибку, если не заключите в кавычки выражение, например

C="white space"
if [ -z $C ]
then
  ...
fi

приведет к синтаксической ошибке:

-bash: [: white: binary operator expected

пока все работает нормально:

C="white space"
if [ -z "$C" ]
then
  ...
fi

Это связано с тем, что после раскрытия переменной в первом случае без кавычек bash видит следующее:

if [ -z white space ]
then
  ...
fi

и оператор -z ожидает только один, а не два аргумента. Во втором цитируемом случае bash видит это:

if [ -z "white space" ]
then
  ...
fi

т.е. только один аргумент, как требуется. Обратите внимание, что в назначении были использованы кавычки

C="white space"

, поскольку это также приведет к ошибке, если вы напишите

C=white space

, поскольку это будет означать: выполнить команду space со средой, содержащей добавленную переменную C=white.

Итак, в общем случае вы должны заключать эти выражения в кавычки, чтобы ваш код был более устойчивым к непредвиденным значениям переменных. Это особенно верно, если значение переменной берется из входных данных, файла и т. Д. Обычно безопасно отбрасывать кавычки для целочисленных переменных или когда вы просто хотите отобразить значение переменной, как в echo $C.

4 голосов
/ 27 ноября 2011

Имеет значение, когда строка содержит пробельные символы. Без кавычек пробельные символы рассматриваются как разделители токенов, а bash пытается интерпретировать замещенную строку как выражение.

Всегда ставьте кавычки в безопасное место, если вы не собираетесь оценивать переменную как часть выражения.

Представьте, что вы изменили ввод с "примера" на "два слова", тогда вы можете столкнуться со странным поведением или даже синтаксическими ошибками при выполнении скрипта, если вы пропустили вышеперечисленное.

Другими словами,

C="abc def"
# the echo command receives one argument: "abc def"
echo "$C"
# echo receives two arguments: "abc" and "def"
echo $C
# bash tries to execute the program "abc" with a first argument "def"
$C
# bash tries to execute the program "abc def"
"$C"
2 голосов
/ 27 ноября 2011

Хорошая документация о кавычках и разделении слов:

"ИСПОЛЬЗУЙТЕ БОЛЬШЕ ЦИТАТ!"Они жизненно важны.Также изучите разницу между ' и " и `.См. http://mywiki.wooledge.org/Quotes и http://wiki.bash -hackers.org / syntax / words

образец greybot из IRC freenode #bash говорит с миром =)

1 голос
/ 27 ноября 2011

Если это константа, состоящая из одного слова, это не имеет значения.

Однако вы должны прочитать о двух видах цитирования.Попробуйте эту статью и эту документацию .Существует также ТАК вопрос .

0 голосов
/ 27 ноября 2011

Попробуйте на реальном примере с пробелами.Для строки example вам не нужно никаких кавычек вообще.Поэтому создайте файл с именем This is an example.txt и повторите попытку.Заменить echo на ls ...

...