Являются ли следующие два логических выражения одинаковыми?
if [ -n $1 ] ; then
if [ -n "$1" ] ; then
Если нет - Когда следует заключать переменную в кавычки?
Вот пример, который должен продемонстрировать разницу
~$ t="alfa beta"
~$ if [ -n $t ] ; then echo OK ; fi
bash: [: alfa: binary operator expected
~$ if [ -n "$t" ] ; then echo OK ; fi
OK
~$ ls blah*
blah1 blah2 blah3
~$ t="blah*"
~$ if [ -n "$t" ] ; then echo OK ; fi
OK
~$ if [ -n $t ] ; then echo OK ; fi
bash: [: too many arguments
Другими словами, при использовании котировок $t
расширяется только один раз и в качестве единственного аргумента помещает в кавычки test
(][
является лишь псевдонимом к test
). Без кавычек она заменяется содержимым $t
, а затем снова расширяется .
В условиях test
, которые совпадают с условиями [
, всегда следует использовать двойные кавычки, иначе команда test
может пропустить аргумент, если переменная пуста или неопределена, или иметь слишком много аргументов, если переменная содержит пробелы. В команде bash
, однако, безопаснее использовать builtin [[
для условий, которым не нужны кавычки.