分组和简化多个 if 条件/bash

  • 本文关键字:if 条件 bash 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将停止检查条件,任何建议都会得到赞赏

如果你希望的是更短的代码,你可以做这样的事情:

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

这不是逻辑意义上的"更简单",而是更简洁。

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

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

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

这是一个替代的想法。我们创建一个布尔值数组,其中包含逻辑条件的评估结果。对于每个条件i定义一对函数func${i}0func${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

编辑:

  1. 根据查尔斯·达菲的建议,{(:)}替换为{ :;}
  2. 在循环中使用$(seq)效率低下,但明确增加循环计数器似乎有点太多了。

最新更新