我有多个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
答案 0 :(得分:1)
如果您希望的是更短的代码,您可以执行以下操作:
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代码)。
答案 1 :(得分:0)
很难对要求某种方式的问题给出明确的答案。
这是另一种想法。我们创建一个布尔值数组,其中包含逻辑条件评估的结果。并为每个人
条件i
定义了一对函数func${i}0
和func${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
<强>编辑:强>
{(:)}
替换{ :;}
$(seq)
是低效的,但却是明确的
递增循环计数器似乎有点太难以输入。