Bash流量控制问题

时间:2015-12-22 20:18:48

标签: bash testing while-loop break

我有一个bash流量控制问题,我已经解决了'而#39;。这是一个非常简化的版本:

while :; do 
[[ $x = $y ]] || { echo x & y differ; break; }; 
[[ $v -ge $u ]] || { echo v is less than u; break; }; 
echo another test and code; break;
done; 
echo end of tests

它由一系列不相关的测试和一些代码组成。必须按顺序完成测试,直到执行其代码。这些规则与“案例”相同。但我看不出如何使用案例进行这种无关的测试。请注意,虽然我使用了'而#39;没有涉及循环。

除了功能之外,其他人在这种情况下会使用什么替代简洁的bash结构?

2 个答案:

答案 0 :(得分:3)

编辑:删除了此处已删除的答案的链接。

我曾经在C中使用了相同的结构(带有很多strcmp()命令的while循环和找到正确的一个中断后),但后来我意识到它很糟糕(我甚至通过使用预编译器选项将SWITCH定义为while命令)。稍微好一些,但仍然很丑陋是我的第二种方法,在Bash中翻译为:

# Set up testdata
i=1
j=2
k=3
l=4
m=5
n=6
p=1
# Continue testing until test succeeds
okfound=0
test okfound && okfound=$(test $i -eq $j) && echo "i = j"
test okfound && okfound=$(test $i -eq $k) && echo "i = k"
test okfound && okfound=$(test $i -eq $l) && echo "i = l"
test okfound && okfound=$(test $i -eq $m) && echo "i = m"
test okfound && okfound=$(test $i -eq $n) && echo "i = n"
test okfound && okfound=$(test $i -eq $p) && echo "i = p"
test okfound && okfound=$(test $i -eq $j) && echo "i = j"
echo "end of tests" 

我在C代码中寻找这样的解决方案的主要原因是试图避免嵌套if-then-else缩进。在Bash中你可以使用elif,我认为你应该停止尝试找到一个智能解决方案,并选择简单的

if   [ $i -eq $j ]; then echo "i = j"
elif [ $i -eq $k ]; then echo "i = k"
elif [ $i -eq $l ]; then echo "i = l"
elif [ $i -eq $m ]; then echo "i = m"
elif [ $i -eq $n ]; then echo "i = n"
elif [ $i -eq $p ]; then echo "i = p"
elif [ $i -eq $j ]; then echo "i = j"
fi

答案 1 :(得分:1)

您正在使用while循环来建立break将退出的范围。使用嵌套的if / else语句可以实现相同的控制流程,但如果您的实际代码确实复杂得多,则可能很难遵循。

如果while循环和break对您不满意,那么您可以采用这种方法:

   { [[ $x != $y ]]  && { echo x '&' y differ; :; }; } \
|| { [[ $v -lt $u ]] && { echo v is less than u; :; }; } \
|| { echo etc. }

请注意,我已经改变了您的条件,并将break替换为:。如果你愿意依赖前面的命令不失败,后者是不必要的(break可以完全删除)。

无论哪种方式,这都会稍微缩短一些。但是,你不能比现有的更简洁。