Подводные камни в Bash №3
Когда в Bash ты сравниваешь две переменные, важно не проебаться с кавычками.
читать первым в телеграм читать первым в макс
[ $foo = "bar" ]
В этом примере если переменная $foo будет пустой, то по итогу ты попадешь в просак:
[ = "bar" ]
bash: [: =: unary operator expected
Логично вылезет ошибка, потому что «=» ожидает два значения. Чтобы избежать этой ситуации, на помощь приходят — кавычки.
[ "$foo" = "bar" ]
Теперь всё в поряде. Ошибки никакой нет.
Но Bash не пальцем деланный, поэтом сравнить две переменные можно иначе.
[[ $foo == bar ]]
Теперь кавычки нахуй не нужны. Но опять же если в переменной будут спецсимволы, то тебя ожидают грабли.
Есть еще легаси способ:
[ x"$foo" = x"bar" ]
Если $foo пустая, то без x получится:
[ = bar ]
А с x будет:
[ x = xbar ]
В [[ ... ]] переменные не разделяются на слова, даже если содержат пробелы.
foo="hello bashdays"
[[ $foo = "hello bashdays" ]]
А если сделать так:
foo="hello bashdays"
[ $foo = "hello bashdays" ]
Получишь ошибку: bash: [: too many arguments
Все это справедливо для Bash. Если пишешь под sh, то твой путь это одинарные скобки [...].
А еще в двойных скобках можно использовать шаблоны:
foo="hello bashdays"
[[ $foo == h* ]]
Вернёт true, потому что foo начинается с «h».
Либо написать сложное условие:
[[ $foo = "bar" || $bar = "baz" ]]
В одинарных кавычках это выглядело бы так:
[ "$foo" = "bar" -o "$bar" = "baz" ]
Выводы:
Всё что тебе нужно знать это первые два способа:
[ "$foo" = "bar" ]
[[ $foo == bar ]]
Это трувей, бестпрактика и мастхев.
Изучай.
