我有一个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结构?
答案 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
可以完全删除)。
无论哪种方式,这都会稍微缩短一些。但是,你不能比现有的更简洁。