Обратите внимание, что [] && cmd
это не то же самое, что if .. fi
строительство.
Иногда его поведение довольно похоже, и вы можете использовать [] && cmd
вместо if .. fi
. Но только иногда. Если у вас есть более одной команды для выполнения, если условие или вам нужно if .. else .. fi
быть осторожным и прорабатывать логику.
Пара примеров:
[ -z "$VAR" ] && ls file || echo wiiii
Это не то же самое, что
if [ -z $VAR ] ; then
ls file
else
echo wiii
fi
потому что, если ls
не удастся, echo
будет выполнено, что не произойдет с if
.
Другой пример:
[ -z "$VAR" ] && ls file && echo wiii
это не то же самое, что
if [ -z "$VAR" ] ; then
ls file
echo $wiii
fi
хотя эта конструкция будет действовать так же
[ -z "$VAR" ] && { ls file ; echo wiii ; }
пожалуйста, обратите внимание, ;
после того, как эхо важно и должно быть там.
Таким образом, возобновив утверждение выше, мы можем сказать,
[] && cmd
== если первая команда успешна, выполнить следующую
if .. fi
== если условие (которое может быть и тестовой командой), затем выполнить команду (ы)
Так что для переносимости [
и [[
использования [
только.
if
совместим с POSIX. Так что, если вам придется выбирать между [
и if
смотреть на вашу задачу и ожидаемое поведение.
[ … ]
против[[ … ]]
противtest …
, есть более полные ответы в этом основном дубликата вопроса .