首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模仿Python的“for-否则”构造

模仿Python的“for-否则”构造
EN

Stack Overflow用户
提问于 2013-08-27 14:13:04
回答 6查看 3.1K关注 0票数 18

Python有一个名为"for-else“的方便的语言特性(类似地,"while-else"),如下所示:

代码语言:javascript
复制
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中有办法做到这一点吗?我能想到的最接近的方法是使用一个标志变量:

代码语言:javascript
复制
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

更详细的是。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-08-27 14:38:51

使用子subshell:

代码语言:javascript
复制
( 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"
票数 10
EN

Stack Overflow用户

发布于 2013-08-27 14:19:56

您可以在循环列表中放置一个前哨值:

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2013-08-27 14:29:55

引入类似语法的非常麻烦的东西:

代码语言:javascript
复制
#!/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
代码语言:javascript
复制
$ ./t.sh a
$ ./t.sh d
nothing matched
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18467890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档