Esta pergunta é uma espécie de sequela da minha pergunta anterior . Os usuários deste site gentilmente me ajudaram a determinar como escrever um for
loop bash 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
"sim!" quando fname
tem 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 if
declaração aparentemente produz verdade quando fname
tem o valor "a.txt"
? Eu usei |
incorretamente?
-o
dentro do mesmo [ ]
.
||
e separar [ ]
mais -o
para 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.