desenv-web-rp.com

Em um script bash, usando a instrução condicional "ou" em uma "se"

Esta pergunta é uma espécie de sequela do meu pergunta anterior . Os usuários deste site gentilmente me ajudaram a determinar como escrever um loop bash for 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 "yes!" quando fname tiver o valor "a.txt" ou "c.txt" e echo "não!" de outra forma. Eu tentei o seguinte script do 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 instrução if aparentemente é verdadeira quando fname tem o valor "a.txt"? Eu usei | incorretamente?

183
Andrew

Se você quiser dizer OR use double pipe (||).

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 maneira que qualquer tubo comum funciona.)

314
bahamat

A resposta aceita é boa, mas como você está usando o bash, adicionarei a solução bash:

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

Isso está documentado no manual de referência do bash .2.4.2 Construções condicionais

expression1 && expression2

Verdadeiro se expressão1 e expressão2 forem verdadeiras.

expressão1 || expression2

Verdadeiro se expressão1 ou expressão2 for verdadeira.

O && e || operadores não avaliam expressão2 se o valor da expressão1 for suficiente para determinar o valor de retorno de toda a expressão condicional.

20
jesse_b

Que tal algo como:

if [ a = b ] || [ c = d && e = f]

A sintaxe pode ser complicada ...

0
Yamovitch

Você pode usar ou condicionar como este

 if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]
0
Sagar Jagnade