O que você escreveu na verdade quase funciona (funcionaria se todas as variáveis fossem números), mas não é uma maneira idiomática.
(…)
parênteses indicam um subshell . O que há dentro deles não é uma expressão como em muitos outros idiomas. É uma lista de comandos (assim como parênteses externos). Esses comandos são executados em um subprocesso separado, portanto, qualquer redirecionamento, atribuição, etc. realizado dentro dos parênteses não tem efeito fora dos parênteses.
- Com um cifrão à esquerda,
$(…)
é uma substituição de comando : há um comando entre parênteses e a saída do comando é usada como parte da linha de comando (após expansões extras, a menos que a substituição seja entre aspas duplas, mas isso é outra história ) .
{ … }
chaves são como parênteses, pois agrupam comandos, mas apenas influenciam a análise, não o agrupamento. O programa x=2; { x=4; }; echo $x
imprime 4, enquanto que x=2; (x=4); echo $x
imprime 2. (As chaves também exigem espaços ao seu redor e um ponto-e-vírgula antes de fechar, enquanto os parênteses não. Isso é apenas uma peculiaridade de sintaxe.)
- Com um sinal de dólar à frente,
${VAR}
é uma expansão de parâmetro , expandindo para o valor de uma variável, com possíveis transformações extras.
((…))
parênteses duplos cercam uma instrução aritmética , isto é, uma computação em números inteiros, com uma sintaxe semelhante a outras linguagens de programação. Essa sintaxe é usada principalmente para atribuições e em condicionais.
- A mesma sintaxe é usada em expressões aritméticas
$((…))
, que se expandem para o valor inteiro da expressão.
[[ … ]]
colchetes duplos cercam expressões condicionais . Expressões condicionais são construídas principalmente em operadores , como -n $variable
para testar se uma variável está vazia e -e $file
para testar se existe um arquivo. Há também operadores de corda de igualdade: "$string1" == "$string2"
(cuidado que o lado direito é um padrão, por exemplo, [[ $foo == a* ]]
testes se $foo
inicia com a
enquanto [[ $foo == "a*" ]]
testa se $foo
é exatamente a*
), e o familiar !
, &&
e ||
operadores de negação, conjunção e disjunção, bem como parênteses para agrupar. Observe que você precisa de um espaço ao redor de cada operador (por exemplo [[ "$x" == "$y" ]]
, não [[ "$x"=="$y" ]]
) e um espaço ou um caractere como ;
dentro e fora dos colchetes (por exemplo [[ -n $foo ]]
, não[[-n $foo]]
)
[ … ]
colchetes simples são uma forma alternativa de expressões condicionais com mais peculiaridades (mas mais antigas e mais portáteis). Não escreva nenhum por enquanto; comece a se preocupar com eles quando encontrar scripts que os contenham.
Esta é a maneira idiomática de escrever seu teste no bash:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Se você precisar de portabilidade para outros shells, esta seria a maneira (observe as citações adicionais e os conjuntos separados de colchetes em torno de cada teste individual, e o uso do =
operador tradicional em vez da ==
variante ksh / bash / zsh ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then