Estou tentando executar o seguinte loop, porém estou falhando. Eu li sobre parênteses duplos e outras coisas, no entanto, não consigo fazer funcionar (especialmente a segunda parte em combinação com grep
). Posso fazer cada parte funcionar separadamente, mas não as duas juntas.
Primeira tentativa:
a=1;
b=1;
while { ( n1=$(grep 'too many requests' *.htm* )) && (( $a -eq $b )) }; do
echo "aa"
done
Segunda tentativa:
while [[ n=$(grep 'too many requests' *.htm* ) && $a==$b ]]; do
echo "error"
done
terceira tentativa
while [[ n=$(grep 'too many requests' *.htm* ) && "$a" -eq "$b" ]]; do
echo "aa"
done
O que eu espero: se os arquivos HTML não contiverem a frase "too many requests", e a
for igual b
, entre no loop.
Isso usa o status de saída negado
grep
e o resultado da comparação$a
e$b
para igualdade de string (use[
's-eq
para avaliação de inteiro de igualdade). Se ambos forem verdadeiros (a string não for encontrada em nenhum arquivo correspondente*.htm*
e as duas variáveis forem idênticas), então oecho
é executado, gerando a stringerror
para o fluxo de erro padrão.Observe o uso de single
=
com espaços ao redor. O operador=
(ou-eq
) é um argumento para o utilitário[
(test
) e não está intrinsecamente ligado àif
palavra-chave.As opções
-q
e-F
para ogrep
utilitário fazem com que o utilitário fique silencioso e saia assim que uma correspondência for encontrada (-q
) e trate o padrão fornecido como uma sequência de texto em vez de uma expressão regular (-F
).Seus exemplos usam um
while
loop, que deve ser umaif
instrução. Se você quiser lidar com cada arquivo separadamente, use umfor
loop:Você não precisa salvar a saída
grep
se quiser apenas testar se um padrão corresponde a um arquivo ou conjunto de arquivos. Em vez disso, você pode usargrep -q
e reagir ao status de saída do utilitário, conforme mostrado acima.Em seu primeiro trecho de código, você usa uma avaliação aritmética,
(( $a -eq $b ))
. Isso poderia ser melhor escrito como(( a == b ))
, que é avaliado como um resultado que umaif
instrução poderia usar como um booleano. O-eq
operador é específico do[
utilitário e não é válido em(( ... ))
.No segundo trecho de código, você usa
$a==$b
. Isso seria avaliado em uma string,1==1
, que o shell tentaria usar como um comando.No terceiro trecho de código, você usa
"$a" -eq "$b"
dentro de[[ ... ]]
, que executa corretamente um teste de igualdade de número inteiro entre$a
e$b
. Isso não funciona como esperado devido aogrep
comando e à maneira como você não nega seu status de saída (e ao fato de usar umwhile
loop em vez de umaif
instrução).Dentro de
[ ... ]
,=
testa a igualdade de strings e-eq
testa a igualdade de inteiros. Tecnicamente,==
não é um operador válido para[ ... ]
testes, masbash
o suporta. Obash
shell faz correspondência de padrão de shell dentro de sua[[ ... ]]
sintaxe especial ao usar==
, como em