Estou tentando escrever um script que irá verificar dois sinalizadores de erro e, caso um sinalizador (ou ambos) sejam alterados, ele ecoará - ocorreu um erro. Meu script:
my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then
echo "$my_error_flag"
else
echo "no flag"
fi
Basicamente, deve haver algo junto:
if ((a=1 or b=2) or (a=1 and b=2))
then
display error
else
no error
fi
O erro que recebo é:
line 26: conditional binary operator expected
line 26: syntax error near `]'
line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'
Meus suportes estão bagunçados?
bash
if-statement
flags
Simplesmente eu
fonte
fonte
a==1 or b==2
já cobre o caso em quea==1 and b==2
. Testar separadamente para isso é completamente supérfluo aqui.Respostas:
Use
-a
(para e) e-o
(para ou) operações.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Atualizar
Na verdade, você ainda pode usar
&&
e||
com a-eq
operação. Portanto, seu script seria assim:Embora no seu caso você possa descartar as duas últimas expressões e ficar com uma ou operação como esta:
fonte
[
e o]
agrupamento (eles não fazem isso) e a falha em colocar espaços ao redor do operador (por exemplo"$my_error_flag"="1"
), o que impede que o shell o reconheça como um operador. Leia BashFAQ # 17 (no agrupamento) e # 31 (sobre a diferença entre diferentes tipos de expressão de teste) . Na verdade, nesse caso, seria ainda mais fácil usar uma expressão aritmética .-a
e-o
são considerados obsoletos pela especificação POSIX ; use testes separados combinados com||
os da atualização.{}
também deve ser possível.Você pode usar uma das palavras-chave
[[
ou((
. Quando você usa[[
palavras-chave, você tem que operadores de string uso, como-eq
,-lt
. Eu acho que((
é o mais preferido para aritmética, porque você pode usar diretamente operadores como==
,<
e>
.Usando
[[
operadorUsando
((
operadorNão use
-a
ou-o
operadores, pois não é portátil.fonte
Por favor, tente seguir
fonte
( ... )
cria subcascas - muito impacto no desempenho, sem nenhum benefício.{ ...; }
para agrupar sem criação de subcasca.Você pode se inspirar lendo um
entrypoint.sh
script escrito pelos colaboradores do MySQL que verifica se as variáveis especificadas foram definidas.Como o script mostra, você pode canalizá-los com
-a
, por exemplo:fonte
-a
está marcado como obsoleto na versão atual dotest
padrão POSIX ; veja osOB
marcadores em pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Use[ -z "$FOO" ] && [ -z "$BAR" ]
para ter um código mais confiável.