Esta pergunta é uma espécie de sequela da minha pergunta anterior . Os usuários deste site gentilmente me ajudaram a determinar como escrever um forloop bash que itera sobre os valores das strings. Por exemplo, suponha que uma variável de controle de loop fnameitere sobre as strings "a.txt" "b.txt" "c.txt". Eu gostaria de echo"sim!" quando fnametem 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 ifdeclaração aparentemente produz verdade quando fnametem o valor "a.txt"? Eu usei |incorretamente?
-odentro do mesmo [ ].
||e separar [ ]mais -opara 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, porque bash's [[é superior em muitas maneiras.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]e não if [ "$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.