Em um script bash, usando o condicional “ou” em uma instrução “if”

76

Esta pergunta é uma sequela das minhas pergunta anterior . Os usuários neste site gentilmente me ajudaram a determinar como escrever um loop bash for que itera sobre valores de string. Por exemplo, suponha que uma variável de controle de loop fname itere 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 de 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

no!

b.txt

no!

c.txt

yes!

Por que a instrução if aparentemente é verdadeira quando fname tem o valor "a.txt" ? Eu usei | incorretamente?

    
por Andrew 08.09.2012 / 22:37

1 resposta

135

Se você quiser dizer OR use o canal duplo ( || ).

if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]

(O código OP original usando | estava simplesmente canalizando a saída do lado esquerdo para o lado direito, da mesma forma que qualquer tubulação comum funciona.)

    
por 08.09.2012 / 22:48