Esta pregunta es una secuela de mi pregunta anterior . Los usuarios de este sitio amablemente me ayudaron a determinar cómo escribir un forbucle bash que itera sobre valores de cadena. Por ejemplo, suponga que una variable de control de bucle fnameitera sobre las cadenas "a.txt" "b.txt" "c.txt". Me gustaría echo"¡sí!" cuando fnametiene el valor "a.txt"o "c.txt", y echo"no!" de otra manera. He intentado el siguiente script de bash shell:
#!/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
Obtengo la salida:
a.txt
¡No!
b.txt
¡No!
c.txt
¡si!
¿Por qué la ifafirmación aparentemente es verdadera cuando fnametiene el valor "a.txt"? ¿Lo he usado |incorrectamente?
                    
                        bash
                                shell-script
                                
                    
                    
                        Andrés
fuente
                
                fuente

-odentro del mismo[ ].||y separar[ ]más-opara la portabilidad, simplemente porque[no está garantizada para soportar más de 4 argumentos. Por supuesto, si el idioma de destino esbash, nadie debería usarlo de[todos modos porquebashel[[es superior en muchos aspectos.if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]lugar deif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]?bash, como ya lo estás haciendo. Una ventaja de esto[[es que no divide las palabras (caso especial), por lo que[[ $unquoted_var = string ]]es seguro.Respuestas:
Si quieres decir
ORusa double pipe (||).(El código OP original que se usaba
|era simplemente canalizar la salida del lado izquierdo al lado derecho, de la misma manera que funciona cualquier tubería normal).fuente
||no hace una lógica estándar "OR": hace un cortocircuito y el segundo comando se ejecuta solo si el primero falla.ORsi la primera condición se evalúa como verdadera.==pero después de ver esta respuesta, decidí buscarla. Aparentemente, "se puede usar pero no es estándar". Pensé que pondría esto aquí para otros si tienes curiosidad: stackoverflow.com/a/2237103testque también recomienda la página deif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]](si desea o necesita tener la funcionalidad adicional asociada[[ ]]).