Обратите внимание, что [] && 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 …, есть более полные ответы в этом основном дубликата вопроса .