Какие ситуации существуют, когда переменные Bash не должны быть двойными кавычками?

Я знаю несколько ситуаций, когда нет необходимости использовать двойные кавычки при расширении переменной в Bash, например внутри [[...]] , или при использовании в правой части присваивания переменной.

Когда я читаю о цитирующих переменных, я часто слышу, что часто лучше использовать двойные кавычки повсюду, так как есть только очень мало случаев, когда вы не захотите их.

Каковы случаи, когда поведение от цитирования нежелательно? Я не говорю о ситуациях, когда вам не нужно указывать, но где цитирование переменной будет активно останавливать что-то от работы.

Не указывайте, когда вы хотите, чтобы пустая переменная исчезла (в отличие от оставшейся пустой строки):

 verbose= [[ some_condition ]] && verbose=-v # ...later... some_program $verbose some_args 

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

 exclude_file= [[ -s excludelist.txt ]] && exclude_file='--exclude excludelist.txt' # ...later... rsync -avP $exclude /path/to/source/ remote:target 

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

Избежать цитирования желательно, когда мы хотим, чтобы оболочка подумала: «О, это все отдельные элементы, а не одно целое!». Такая вещь может быть весьма полезна с массивами.

 bash-4.3$ var="one two three" bash-4.3$ arr=( $var ) bash-4.3$ for i in "${arr[@]}"; do echo "$i"; done one two three 

В частности, это полезно, когда вы генерируете массив, как в примере выше. Я лично использовал такой подход при перечислении фактических адресов рабочих пространств Ubuntu (точная терминология – это видовые экраны, и они используют формат координат, такой как X, y, но это целая история).

Другой подход заключается в том, что вы передаете переменную другой команде, которая должна обрабатывать их как отдельные элементы. Для сравнения:

 bash-4.3$ bash -c 'for item; do echo $item; done' sh "$var" one two three bash-4.3$ bash -c 'for item; do echo $item; done' sh $var one two three 

Чтобы рассмотреть то, что было упомянуто в комментариях, эти примеры не предназначены для использования с «неожиданным вводом», а скорее для контролируемой среды. Кроме того, можно set noglob , если нужно избегать глобализации, но опять же – если вы генерируете массив для определенной комбинации строк, например числовые значения видовых экранов рабочего стола, вообще никакой опасности от glog . Если вы имеете дело с фактическим пользовательским вводом, тогда должны использоваться кавычки, и это не та тема этого вопроса.

[] = встроенный, увеличенная мобильность

[[]] = составная команда, увеличенная функциональность

предлагайте использовать единые скобки при создании скрипта с отступом для совместного использования на нескольких платформах.