Какую форму предпочтительнее использовать в Bash?

Я учусь Bash, и я вижу, что форма

С = пример

эхо "$C"

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

С ="Пример"

эхо $ C

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

5 ответов

Решение

Если вы уверены, что значение переменной - это одно слово (без пробелов), тогда можно использовать $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,

Имеет значение, когда строка содержит пробельные символы. Без кавычек пробельные символы рассматриваются как разделители токенов, а 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"

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

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

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

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

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

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

Другие вопросы по тегам