Se deseja expressar o seguinte teste no shell (sh):
if ( a == 1 && ( b == 1 || b == 2 )) { ... }
Até agora, o melhor que pude escrever é o seguinte:
if [[ $a -eq 1 ]]; then
if [[ $b -eq 1 || $b -eq 2 ]]; then
...
fi
fi
Não sei como combinar && e || com precedência correta. O Google não me deu nenhuma resposta (os tutoriais fornecem apenas exemplos básicos, se houver)
Qual é a sintaxe para combinar os dois se em um?
ksh
? Então seu código inicial exigiria apenas mais um par de parênteses:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
Respostas:
Observe que
[[ ]]
não está no Bourne ou no POSIXsh
. Para verdadeirash
sintaxe, existem várias maneiras de fazer isso.Usando apenas um
[ ]
parou Evitando o POSIX
-a
e-o
opções 11 Um motivo para evitar
-a
e-o
é a portabilidade máxima - nem todastest
ou[
implementações podem lidar com mais de quatro argumentos, que é exatamente o que você obtém se encadear expressões com-a
e-o
e\( \)
.fonte
/bin/sh
, é incorreto escrevê-lo usando os recursos que não estão nosh
. Você deve estar ciente de queksh
NÃO ésh
, mas sim um superconjunto desh
. Se você levar seuksh
-mas-declarado-como-sh
script para um sistema em quesh
não há um link simbólicoksh
, ele poderá ser interrompido. Você pode evitar esse problema, certificando-se de que seu script corresponda à declaração./bin/sh
invocará/bin/sh
. O problema é/bin/sh
que não aceita[[
. Você não pode usar[[
ou usar um shell que aceite[[
, por exemploksh
, como seu shebang.-a
/-o
não seja suportado por algumas implementações, mas que não é confiável para argumentos arbitrários. Like[ "$a" = "$b" -o "$b" = "$c" ]
falharia em valores de$a
like!
com muitas[
implementações.Eu tentei alguma sintaxe e descobri que
está funcionando.
fonte
Outra abordagem POSIX:
fonte
A maneira correta de fazer isso com um mero
shell
:Explicação:
test
aqui serve como parênteses e-o
lógico ou. Se você é um lógico e dentro do "parêntese" você usaria-a
.Mais sobre isso pode ser encontrado aqui
fonte