Подражая Python "для-еще" конструкции
В Python есть удобная функция языка под названием "for-else" (аналогично "while-else"), которая выглядит следующим образом:
for obj in my_list:
if obj == target:
break
else: # note: this else is attached to the for, not the if
print "nothing matched", target, "in the list"
По сути, else
пропускается, если цикл прерывается, но выполняется, если цикл завершился из-за сбоя условия (для while
) или конец итерации (для for
).
Есть ли способ сделать это в bash
? Самое близкое, что я могу придумать, это использовать переменную flag:
flag=false
for i in x y z; do
if [ condition $i ]; then
flag=true
break
fi
done
if ! $flag; then
echo "nothing in the list fulfilled the condition"
fi
что довольно многословно.
6 ответов
Используя подоболочку:
( for i in x y z; do
[ condition $i ] && echo "Condition $i true" && exit;
done ) && echo "Found a match" || echo "Didn't find a match"
Вы можете поместить значение часового в список цикла:
for i in x y z 'end-of-loop'; do
if [ condition $i ]; then
# loop code goes here
break
fi
if [ $i == 'end-of-loop' ]; then
# your else code goes here
fi
done
Что-то очень странное, чтобы ввести похожий синтаксис:
#!/bin/bash
shopt -s expand_aliases
alias for='_broken=0; for'
alias break='{ _broken=1; break; }'
alias forelse='done; while ((_broken==0)); do _broken=1;'
for x in a b c; do
[ "$x" = "$1" ] && break
forelse
echo "nothing matched"
done
$ ./t.sh a
$ ./t.sh d
nothing matched
Вы можете сделать это, но мне лично трудно читать:
while :;
do for i in x y z; do
if [[ condition ]]; then
# do something
break 2
done
echo Nothing matched the condition
break
done
Мне также нравится ответ Devnull, но он еще более питоничен:
for i in x y z; do
[ condition $i ] && break #and do stuff prior to break maybe?
done || echo "nothing matched"
Это будет эхом только "ничего не совпало", если цикл не прерывался.
Вы можете изменить это
if ! $flag; then
echo "nothing in the list fulfilled the condition"
fi
к чему-то более простому, как это
"$flag" || echo "nothing in the list fulfilled the condition"
если у вас есть только одно заявление после него, хотя это не очень поможет.