Допустим, у нас есть 2 целых числа в скрипте bash:
value1=5
value2=3
Тогда зачем нам использовать двойные кавычки в случае теста? Например:
if [[ "$value1" -eq "$value2" ]]
Почему бы просто не использовать следующее?
if [[ $value1 -eq $value2 ]]
Для меня двойные кавычки не имеют никакого смысла.
5
и3
, - ремонтопригодность. Значения могут измениться позже, и получающиеся ошибки могут не быть очевидными.[[ ]]
, только для[ ]
.[[ ]]
них они также приводят операнды-eq
к целым числам.Ответы:
Разделение слов.
Этот пример очень маловероятен, но возможен , поэтому, если вы хотите защитить код, закройте ваши треки кавычками:
Хорошо, пока все хорошо. Давайте бросим гаечный ключ в шестеренки:
К сожалению.
Ааа.
источник
[[ ]]
конструкции bash .[ $value1 -eq $value2 ]
с пустымvalue1
будет'[' -eq 3 ']'
с нет''
на левой стороне.Вам на самом деле не нужны цитаты здесь. Это один из немногих случаев, когда безопасно использовать переменную без кавычек. Вы можете подтвердить это с помощью
set -x
:Как вы можете видеть выше, версии теста в кавычках и без кавычек разрешаются в bash точно так же. То же самое должно быть верно и для
zsh
любой другой оболочки, поддерживающей[[ ]]
оператор.Обратите внимание, что это не относится к более портативным
[ ]
:[ ]
Конструкция, в отличие от[[ ]]
одного, требует кавычек.Некоторые полезные ссылки, чтобы узнать больше о том, когда и почему требуется цитирование:
источник
declare -i var1=
это0
когда оценивается.-eq
это арифметическое сравнение, так что вы можете даже оставить$
out (in[[ .. ]]
) и написать[[ a -eq b ]]
. При сравнении строк нужно$
, конечно, так[[ $a = $b ]]
var1="afoob"; var2="a*b"; [[ $var1 = $var2 ]] && echo match
. Если вы хотите использовать символы glob без их действия в качестве glob в контексте globbing (например, в[[ ]]
), тогда вам нужно процитировать, да.((...))
или$((...)
. Кажется, это работает, но (старый сварливый человек, включите), мне это не нравится.-eq
и друзья внутри[[ ]]
тоже являются арифметическими контекстами. :) (Связано: автоматическое расширение переменных внутри команды bash [[]] )Хотя двойные кавычки не нужны, причины их использования:
value1
иvalue2
являются переменными, и вы можете не знать, что они содержат. В противном случае вы могли бы также спросить: «Зачем беспокоиться о переменных, а не проверятьif [[ 5 -eq 3 ]]
? Или продолжать? Зачемif
вообще беспокоиться о том, когда вы уже знаете, что 5 не равно 3? Часто лучше защищаться». это разделение слов не произойдет[[
, но случаи, когда разделение слов не происходит, редки. Опять же, смотрите первый пункт.)источник
Не имеет прямого отношения к вашему вопросу, но я использую
когда я сравниваю числа, но там вы также не должны использовать кавычки.
источник
if (( value1 == value2 )); then
, В арифметическом контексте вам даже не нужно$
. Этот вопрос, однако, кажется, фокусируется на переменных, используемых в[[ ... ]]
тестах.Вы абсолютно правы!
Цитирование в двойных квадратных скобках не имеет никакого смысла, по крайней мере, в этом случае.
Но так как я использую двойные кавычки ежедневно - особенно для выражений в одной квадратной скобке, передачи аргументов функциям и сценариям, а также иногда для присваивания переменных (что совершенно бесполезно для простых делкакаций) - я предполагаю, что некоторые люди, по крайней мере, делают, писать двойные кавычки вокруг переменных расширения инстинктивно .
Преимущество выполнения двойных кавычек последовательно и понятно - но только в том смысле, в котором это имеет смысл - заключается в том, что коллеги, новички в bash, могут научиться писать более стабильные сценарии . Это также подчеркивает тот факт, что искусство обработки данных с помощью bash больше связано с разделением потоков данных (включая переменные) с помощью разделителей полей и передачей их через фильтры . Как только вы отделите свои блоки данных от потока, объедините их в двойные кавычки!
Еще одним преимуществом может быть лучшая читаемость сценариев bash со строками в двойных кавычках в редакторе с подсветкой кода .
источник