Esta pregunta es una secuela de mi pregunta anterior . Los usuarios de este sitio amablemente me ayudaron a determinar cómo escribir un for
bucle bash que itera sobre valores de cadena. Por ejemplo, suponga que una variable de control de bucle fname
itera sobre las cadenas "a.txt" "b.txt" "c.txt"
. Me gustaría echo
"¡sí!" cuando fname
tiene 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 if
afirmación aparentemente es verdadera cuando fname
tiene el valor "a.txt"
? ¿Lo he usado |
incorrectamente?
-o
dentro del mismo [ ]
.
||
y separar [ ]
más -o
para la portabilidad, simplemente porque [
no está garantizada para soportar más de 4 argumentos. Por supuesto, si el idioma de destino es bash
, nadie debería usarlo de [
todos modos porque bash
el [[
es superior en muchos aspectos.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
lugar de if [ "$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.