Estou fornecendo um loop while com o seguinte
#!/bin/bash
number1=1
while [ -z "$number2" ] | [ "$number2" == 404 ] & [ "$number2" != 200 ] & [ "$number1" -lt 13 ]; do
#number2=$(some command which can actually get a number)
number2=200 # <<< e.g. a command that would return
let number1=number1+1
done
Isso é o que eu preciso fazer
Se
number2
for null faça o loop
Senumber2
for 404 faça o loop
Senumber2
for 200 não faça o loop
Faça o loop até quenumber1
seja 12
Quando eu tento o loop com number2=200
ele não para. Parece que estou tendo um desafio em fazê-lo parar onde number2
está 200
.
Como escrevo a instrução de forma que ela pare o loop while quando number2=200
ou há uma alternativa?
Em outras palavras, repita enquanto
(number2 is null OR number2 = 404) AND (number2 != 200) AND (number1 <= 12)
. Observe que você precisa de algum tipo de agrupamento aqui, para tornar explícita a precedência de AND e OR. (No Bash,&&
e||
opera da esquerda para a direita, mas muitas vezes o operador AND se liga mais fortemente do que um operador OR.)Embora você não tenha dito o que deveria acontecer para outros valores de
number2
, então podemos descartar as duas primeiras condições, já que senumber2
for nulo ou 404, então não pode ser 200. Então, obtemos(number2 != 200) AND (number1 <= 12)
.Aqui,
você tem
|
e&
em vez de||
e&&
.|
indica um pipeline e&
executa o comando anterior em segundo plano. Portanto, o comando acima executaria três comandos em paralelo: um pipeline com dois testes e outro com um teste, ambos em segundo plano; e um teste em primeiro plano. Isso não faz muito sentido. Eu mencionei&&
e||
acima, esses são os operadores de condição lógica no Bash.A forma simplificada seria:
(Você também pode querer usar nomes de variáveis um pouco mais descritivos do que "number1" e "number2".)
Os operadores lógicos no shell são
&&
e||
. O&
and|
faz coisas muito diferentes (inicia uma tarefa em segundo plano e configura um pipe entre dois processos, respectivamente).O número em
$number2
parece um código de status HTTP. Testar o valor em umacase
instrução como acima permitiria selecionar a ação correta, dado qualquer número de códigos de status, sem tornar o código do shell uma bagunça pesada deif
instruções. Por exemplo, a ação para qualquer código de falha de cliente ou servidor pode ser acionada pelo padrão4??|5??
.Isso também separa logicamente a semântica das duas variáveis. A
number1
variável controla o número de iterações, enquantonumber2
é estritamente para controlar a ação a ser executada com base no resultado do seu comando misterioso.