Этот вопрос является своего рода продолжением моего предыдущего вопроса . Пользователи на этом сайте любезно помогли мне определить, как написать for
цикл bash, который перебирает строковые значения. Например, предположим, что переменная управления цикла fname
перебирает строки "a.txt" "b.txt" "c.txt"
. Я хотел бы echo
"да!" когда fname
имеет значение "a.txt"
или "c.txt"
, и echo
"нет!" в противном случае. Я пробовал следующий скрипт оболочки 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
Я получаю вывод:
a.txt
нет!
b.txt
нет!
c.txt
да!
Почему if
утверждение очевидно дает истину, когда fname
имеет значение "a.txt"
? Я |
неправильно использовал ?
-o
в том же [ ]
.
||
и отдельно [ ]
над -o
портативность просто потому , что [
не гарантирует поддержку более чем 4 аргумента. Конечно , если целевой язык bash
, никто не должен использовать в [
любом случае , потому что bash
«s [[
превосходит во многих отношениях.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
а не if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?
bash
, как вы уже делаете. Одним из преимуществ [[
является то, что он не выполняет разбиение слов (особый случай), поэтому [[ $unquoted_var = string ]]
является безопасным.