Зверніть увагу, [] && 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
вибирати, дивлячись на своє завдання та очікувану поведінку.
[ … ]
vs[[ … ]]
vstest …
, то в цьому здебільшого повторюваному запитанні є більш повні відповіді .