Есть несколько эквивалентных способов выполнения теста, который вы ищете. Во-первых, по сути, так, как вы это делаете, но с фиксированным синтаксисом (добавлены необходимые пробелы вокруг параметров в команду [
(aka test
) и ;
между ]
и then
) :
if [ 1 = 1 -a 0 = 1 ];then echo 1;else echo 2;fi
Вот версия с явной группировкой в выражении; обратите внимание, что скобки нужно экранировать, потому что они являются специальными символами в оболочке, но в этом случае мы хотим, чтобы они передавались команде [
в качестве аргументов:
if [ \( 1 = 1 \) -a \( 0 = 1 \) ];then echo 1;else echo 2;fi
Другая версия с явной группировкой, на этот раз с использованием двух отдельных команд [
, связанных с оператором bash &&
(обратите внимание, что это также может подключать другие команды):
if [ 1 = 1 ] && [ 0 = 1 ];then echo 1;else echo 2;fi
И, наконец, пара примеров, использующих оператор bash [[
вместо команды [
; обратите внимание, что [[
не является командой, поэтому ее выражение не анализируется как аргументы команды, что позволяет использовать его более интуитивно понятный синтаксис (например, допускает &&
и ||
в качестве операторов, скобки и !<>
сравнения без экранирования ):
if [[ 1 = 1 && 0 = 1 ]];then echo 1;else echo 2;fi
if [[ ( 1 = 1 ) && ( 0 = 1 ) ]];then echo 1;else echo 2;fi
Еще несколько замечаний / предупреждений: оператор =
, используемый во всех этих примерах, выполняет сравнение строк, а не числовое сравнение (т. Е. [ 1 = 01 ]
является ложным); если вы хотите числовое сравнение, используйте вместо него -eq
(аналогично, <
и >
- сравнения строк, в то время как -lt
и -gt
- числовые). Кроме того, если вы сравниваете строки, содержащие пробелы, '[' может ошибочно принять строку за часть выражения при некоторых обстоятельствах (особенно если строки не заключены в двойные кавычки); насколько я знаю [[
никогда не было этой проблемы. В целом, если вы используете оболочки, поддерживающие [[
, гораздо проще иметь дело, чем [
.