Этот вопрос является своего рода продолжением моего предыдущего вопроса . Пользователи на этом сайте любезно помогли мне определить, как написать 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 ]]является безопасным.