Зачем использовать двойные кавычки в тесте [[ ]]?

Я понял это, в основном вдохновленный этим сообщением на форуме Arch .

  • Отключите getty , который в настоящее время работает после tty6 , удалив /etc/init/tty6.conf , это вступит в силу после перезагрузки.
  • Разрешите контейнеру доступ к tty6 , добавив lxc.cgroup.devices.allow = c 4: 6 rwm в конфигурацию контейнера
  • Автозапуск getty ] в контейнере, отредактировав /etc/init/tty6.conf вместо запуска контейнера

     на уровне выполнения [23] # и not-container 

Сейчас Ctrl + Alt + F6 - консоль контейнера.

Дополнительные операции необходимы для tty [1-4] , поскольку / dev / tty [1-4] в контейнере не являются устройствами tty.

23
17.02.2019, 02:15
5 ответов

Разделение слов.

Этот пример очень маловероятен, но возможен , поэтому, если вы хотите защищаться, заметайте следы кавычками:

$ set -x
$ value1=5
+ value1=5
$ value2=3
+ value2=3
$ [ $value1 -eq $value2 ]
+ '[' 5 -eq 3 ']'

Хорошо, пока все хорошо. Давайте бросим ключ в шестерни:

$ IFS=456
+ IFS=456
$ [ $value1 -eq $value2 ]
+ '[' '' -eq 3 ']'
bash: [: : integer expression expected

Ой.

$ [ "$value1" -eq "$value2" ]
+ '[' 5 -eq 3 ']'

Ах.

7
27.01.2020, 19:41

На самом деле здесь кавычки не нужны. Это один из очень немногих случаев, когда безопасно использовать переменную без кавычек. Вы можете подтвердить это с помощьюset -x:

$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!

Как вы можете видеть выше, версии теста в кавычках и без кавычек сводятся к одному и тому же с помощью bash. То же самое должно быть верно для zshи, я думаю, любой другой оболочки, поддерживающей оператор [[ ]].

Обратите внимание, что это , а не случай с более портативным[ ]:

$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!

Конструкция [ ], в отличие от конструкции [[ ]], не требует цитирования.


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

35
27.01.2020, 19:41

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

  • Хорошая практика/привычка :В этом случае они не нужны, но обычно двойные кавычки используются , чтобы избежать непреднамеренного разделения слов.
  • Потому что value1и value2являются переменными, и вы можете не знать, что они содержат. В противном случае вы могли бы также спросить: «Зачем возиться с переменными вместо проверки if [[ 5 -eq 3 ]]? Или, если пойти дальше, зачем вообще возиться с if, когда вы уже знаете, что 5 не равно 3? Часто лучше быть оборонительным (Это правда, что разбиение слова -не происходит в [[, но случаи, когда разбиение слова -происходит , а не , редки. Опять же, см. первый пункт.)
16
27.01.2020, 19:41

Не имеет прямого отношения к вашему вопросу, но я использую

if (( $value1 == $value2 )); then

когда я сравниваю числа, но и здесь кавычки не нужны.

1
27.01.2020, 19:41

Вы абсолютно правы!

Заключение в двойные квадратные скобки вообще не имеет смысла, по крайней мере, в этом случае.

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

Double quoting can give you a sense of savety. It is like coming home where double quotes are. - D. Kummer

Преимущество использования двойных кавычек последовательно и понятно --, но только если это имеет смысл --, заключается в том, что коллеги, которые плохо знакомы с bash, могут научиться тому, как писать более стабильные сценарии . Это также подчеркивает тот факт, что искусство обработки данных с помощью bash больше связано с разделением потоков данных (, включая переменные ), с помощью разделителей полей и передачей их через фильтры . Как только вы отделите фрагменты данных от потока, соедините их вместе двойными кавычками!

Еще одним преимуществом может быть лучшая читаемость сценариев bash со строками в двойных кавычках в редакторе подсветки кода .

1
27.01.2020, 19:41

Теги

Похожие вопросы