Eu tenho o seguinte bash
teste de condição que eu preciso mudar.
if (( exec_rc == 1 )) && [ -z "$keymap_actm" ] && [ -n "$modmap_actm" ]; then
(( exec_rc == 1 ))
deve ser sempre verdade.
Mas se um dos dois [ -z "$keymap_actm" ]
ou [ -n "$modmap_actm" ]
for verdadeiro, quero executar o corpo da condição.
Qual é uma maneira legível de alcançar o que eu quero?
Use
[[ … ]]
em todo (uma construção de expressão condicional ). Observe que dentro de expressões condicionais, a igualdade entre inteiros é soletrada-eq
(==
faria uma correspondência de padrão de texto, que pode ou não funcionar em seu script específico, dependendo dos valores queexec_rc
podem ser assumidos).Observe que você precisa de espaço ao redor dos
[[ … ]]
delimitadores (exceto próximo à pontuação de separação de comando, como;
), mas não precisa de espaços ao redor de parênteses e operadores dentro da expressão condicional.O agrupamento é feito com parênteses, de maneira semelhante à aritmética.
Você poderia fazer (não recomendado):
Mas, no exemplo acima, os parênteses estão criando um sub-shell. Funciona, mas é melhor evitar o subshell usando chaves de shell:
Ou você pode usar a
[[
to group (não use a[
):Ou (sintaxe recomendada):
Observe que a
[[
sintaxe funcionará em todas as versões do bash e na maioria do Ksh ou zsh, mas não no Bournesh
.