2010-03-31

Магия кавычек в POSIX sh.

Столкнулся с кодом, на который ругался интерпретатор:
if [ -n $COMSPEC -a -n $WINDIR ]; then ...
Оказывается переменная окружения COMSPEC раскрывалась в пустую строку и -n скушало -a!

Подумал я взять подвыражения по бокам -a в скобки (утилита test позволяет группировать условия, заключая их в скобки):

if [ \( -n $COMSPEC \) -a \( -n $WINDIR \) ]; then ...
Но снова интерпретатор ругается на недостающую закрывающуюся круглую скобку...

Тут до меня доходит что у -n аппетит хороший и нужно гарантировать ему аргумент! Потому заключаем переменные окружения в двойные кавычки (которые позволяют подстановки в отличии от одинарных кавычек):

if [ -n "$COMSPEC" -a -n "$WINDIR" ]; then ...
Смотрите что делают кавычки с нижеприведенной командой:
$ for item in a "" b; do echo $item; done a b