Обратите внимание, что вы выполняете 2 команды в:
[ $# -ne 1 ] || [ $# -ne 2 ]
[ $# -ne 1 ]
является 1-й командой, а команда [ $# -ne 2 ]
выполняется только в том случае, если предыдущая имеет ненулевой код ошибки наоператор оболочки ||
.
В вашем случае это не важно, но в приведенном ниже случае это:
[ $? -eq 0 ] || [ $? -eq 1 ]
2-я команда всегда будет истинной, так как2-й $?
- это код возврата [ $? -eq 0 ]
.Вы можете проверить это с помощью строк ниже, которые будут печатать true
дважды:
function f() { return $1; }
f 1
{ [ $? -eq 0 ] || [ $? -eq 1 ]; } && echo "true"
f 2
{ [ $? -eq 0 ] || [ $? -eq 1 ]; } && echo "true"
Правильный способ выполнения or
в одной команде:
[ $? -eq 0 -o $? -eq 1 ]
ЭтоКстати, те, что ниже, печатают true
один раз:
function f() { return $1; }
f 1
{ [ $? -eq 0 -o $? -eq 1 ]; } && echo "true"
f 2
{ [ $? -eq 0 -o $? -eq 1 ]; } && echo "true"
А что касается вашего первоначального вопроса, kev уже указал, что в вашем тесте была логическая ошибка.Отрицательное значение [ $# -eq 1 ] || [ $# -eq 2 ]
равно NOT [ $# -eq 1 ] && NOT [ $# -eq 2 ]
и становится [ $# -ne 1 ] && [ $# -ne 2 ]
или одной командой:
[ $# -ne 1 -a $# -ne 2 ]