首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分组和简化多个if条件/ bash

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

Stack Overflow用户
提问于 2017-04-02 13:46:42
回答 2查看 327关注 0票数 0

我有多个If条件要在脚本开头运行

代码语言:javascript
运行
复制
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将停止检查其中一个条件是否属实,任何建议都会被认可。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-02 15:21:30

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

这里有一个替代的想法。我们创建一个包含逻辑条件计算结果的布尔值数组。对于每个条件,i分别定义一对函数func${i}0func${i}1,这些函数将分别在条件i计算为true或false时调用。最后,我们遍历我们的布尔数组。

下面的代码实现了这个想法。挺尴尬的。请随意建议改进或否决。

在这里,我们假设blah值为0或1。

代码语言:javascript
运行
复制
# 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)的效率很低,但是显式地递增循环计数器似乎有点太难键入。
票数 0
EN

Stack Overflow用户

发布于 2017-04-02 16:51:59

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

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43169067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档