我有多个If条件要在脚本开头运行
if blah; then
echo "hop"
fi
if [ ! -f blah-blah ]; then
echo "hop-hop"
else
echo "hip-hop-hap"
fi
if [ $? -eq 0 ]; then
echo "hip-hop"
fi每个条件都是分开的,我有7-8,所以我在想,如果有什么办法把它们分组.我正在考虑使用elif,但是elif将停止检查其中一个条件是否属实,任何建议都会被认可。
发布于 2017-04-02 15:21:30
对于一个要求某种方式的问题,很难给出一个明确的答案。
这里有一个替代的想法。我们创建一个包含逻辑条件计算结果的布尔值数组。对于每个条件,i分别定义一对函数func${i}0和func${i}1,这些函数将分别在条件i计算为true或false时调用。最后,我们遍历我们的布尔数组。
下面的代码实现了这个想法。挺尴尬的。请随意建议改进或否决。
在这里,我们假设blah值为0或1。
# populate array b by evaluating boolean conditions
foo=$( blah ); b[1]=$?
foo=$( [ ! -f blah-blah ] ); b[2]=$?
foo=$( [ $? -eq 0 ] ); b[3]=$?
# For each condition 1 through 3 define the actions when
# the condition is True or False
func10(){
echo "hop"
}
func11(){ :;}
func20(){
echo "hop-hop"
}
func21(){
echo "hip-hop-hap"
}
func30(){
echo "hip-hop"
}
func31(){ :;}
#loop through the array and execute the functions
for i in $(seq 1 ${#b[*]}) ; do
func${i}${b[i]}
done编辑:
{(:)}取代{ :;}$(seq)的效率很低,但是显式地递增循环计数器似乎有点太难键入。发布于 2017-04-02 16:51:59
如果您希望的是更短的代码,您可以这样做:
blah && echo "hop"
[ -f "blah-blah" ] && echo "hip-hop-hap" || echo "hop-hop"
[ $? = 0 ] && echo "hip-hop"这不是逻辑上的“简单”,而是更简洁。
请注意,我从测试中删除了!,并将结果语句切换为一个小的优化。
但是,请注意,如果您想要执行任何类型的错误检查或显式处理(即trap ... ERR、set -e),那么使用逻辑运算符将对此进行干扰,并且您将无法区分脚本中的错误与出于“良好原因”而失败的命令之间的区别(即试图删除一个不存在的文件)。如果只使用echo语句,或者像大多数shell程序员一样,只允许shell忽略失败的语句(在我看来,这不是构建可预测和可靠的shell代码的好方法),那么您很可能是安全的。
https://stackoverflow.com/questions/43169067
复制相似问题