Esta pergunta é uma espécie de sequela da minha pergunta anterior . Os usuários deste site gentilmente me ajudaram a determinar como escrever um for
loop bash que itera sobre os valores das strings. Por exemplo, suponha que uma variável de controle de loop fname
itere sobre as strings "a.txt" "b.txt" "c.txt"
. Eu gostaria de echo
"sim!" quando fname
tem o valor "a.txt"
ou "c.txt"
e echo
"não!" de outra forma. Eu tentei o seguinte script shell bash:
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
Eu obtenho a saída:
a.txt
não!
b.txt
não!
c.txt
sim!
Por que a if
declaração aparentemente produz verdade quando fname
tem o valor "a.txt"
? Eu usei |
incorretamente?
bash
shell-script
Andrew
fonte
fonte
-o
dentro do mesmo[ ]
.||
e separar[ ]
mais-o
para a portabilidade, simplesmente porque[
não é garantido para suportar mais de 4 argumentos. Claro, se a língua-alvo ébash
, ninguém deve estar usando[
de qualquer maneira, porquebash
's[[
é superior em muitas maneiras.if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
e nãoif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?bash
, como você já está fazendo. Uma vantagem[[
disso é que ele não faz a divisão de palavras (caso especial), portanto[[ $unquoted_var = string ]]
é seguro.Respostas:
Se você quiser dizer,
OR
use double pipe (||
).(O código OP original usado
|
era simplesmente canalizar a saída do lado esquerdo para o lado direito, da mesma forma que qualquer tubo comum funciona.)fonte
||
não executa uma lógica padrão "OR" - ele provoca um curto-circuito e o segundo comando é executado apenas se o primeiro falhar.OR
se a primeira condição é verdadeira.==
mas depois de ver essa resposta, decidi procurar. Aparentemente, "pode ser usado, mas não é padrão". Eu pensei em colocar isso aqui para os outros se o seu curioso: stackoverflow.com/a/2237103test
página de manual também recomendaif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
(se desejar ou precisar da funcionalidade extra associada[[ ]]
).