如果条件/ bash,则分组并简化多个

时间:2017-04-02 13:46:43

标签: bash if-statement

我有多个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会停止检查条件,如果其中一条是真的, 任何建议都是ppreciated

2 个答案:

答案 0 :(得分:1)

如果您希望的是更短的代码,您可以执行以下操作:

blah && echo "hop"
[ -f "blah-blah" ] && echo "hip-hop-hap" || echo "hop-hop"
[ $? = 0 ] && echo "hip-hop"

这不是更简单的"从逻辑上讲,它更简洁。

请注意,我从测试中删除了!,并将结果语句切换为小优化。

但请注意,如果您要执行任何类型的错误检查或显式处理(即trap ... ERRset -e),那么使用逻辑运算符会干扰它,您将无法区分脚本中的错误和失败的命令之间的区别"良好的原因" (即尝试删除不存在的文件)。如果你将自己局限于echo语句,或者像大多数shell程序员一样,你允许shell简单地忽略失败的语句(在我看来,这不是构建可预测的语句的好方法),你可能最安全。可靠的shell代码)。

答案 1 :(得分:0)

很难对要求某种方式的问题给出明确的答案。

这是另一种想法。我们创建一个布尔值数组,其中包含逻辑条件评估的结果。并为每个人 条件i定义了一对函数func${i}0func${i}1,它们将在条件i分别求值为true或false时调用。最后,我们遍历我们的布尔数组。

下面的代码实现了这个想法。这很尴尬。随意建议改进或downvote。

这里我们假设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

<强>编辑:

  1. 根据Charles Duffy的建议,{(:)}替换{ :;}
  2. 在循环中使用$(seq)是低效的,但却是明确的 递增循环计数器似乎有点太难以输入。