Linux bash if - elif 没有按预期工作

标签 linux bash

我的 Bash 脚本必须根据变量的开头做一些不同的事情。 当我运行以下脚本时:

#!/bin/bash

line="__B something"

if [ -n $(echo "$line" | grep "^__A") ]; then
   echo "Line __A"
elif [ -n $(echo "$line" | grep "^__B") ]; then
   echo "Line __B"
elif [ -n $(echo "$line" | grep "^__C") ]; then
   echo "Line __C"
elif [ -n $(echo "$line" | grep "^__D") ]; then
   echo "Line __D"
elif [ -n $(echo "$line" | grep "^__E") ]; then
   echo "Line __E"
elif [ $(echo "$line" | grep "^__F") ]; then
   echo -n "Line __F"
else
   echo "something other"
fi

Bash 无法识别字符串以 __B 开头:

输出是:

Line __A

我的脚本有什么问题? 感谢您的帮助!

最佳答案

如果您使用 xtrace 选项运行您的脚本,那么您可以看到发生了什么:

bash -x your-script
+ line='__B something'
++ echo '__B something'
++ grep '^__A'
+ '[' -n ']'
+ echo 'Line __A'
Line __A

因为您使用旧的 test built-in(也称为 [),所以扩展已完成但没有任何结果可以测试,除了-n。使用 [[ 关键字 将正确引用内容:

bash -x your-script
+ line='__B something'
++ echo '__B something'
++ grep '^__A'
+ [[ -n '' ]]
++ echo '__B something'
++ grep '^__B'
+ [[ -n __B something ]]
+ echo 'Line __B'
Line __B

但是,使用外部程序grep是一种浪费。 bash 的最新版本内置了正则表达式 (RE)(使用绑定(bind)运算符 =~),但在这种情况下您不需要 RE,简单的 globbing 就可以了:

#!/bin/bash

line="__B something"

if [[ $line == __A* ]]; then
   echo "Line __A"
elif [[ $line == __B* ]]; then
   echo "Line __B"
elif [[ $line == __C* ]]; then
   echo "Line __C"
elif [[ $line == __D* ]]; then
   echo "Line __D"
elif [[ $line == __E* ]]; then
   echo "Line __E"
elif [[ $line == __F* ]]; then
   echo -n "Line __F"
else
   echo "something other"
fi

关于Linux bash if - elif 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41463713/

相关文章:

linux - 比较脚本帮助

linux - 无法从 bin 运行 spark-shell

bash - 为什么这个 shell 脚本要在命令中插入单引号?

linux - 使用 defsym 定义的符号在 Ubuntu 16.10 上给出了错误的地址

linux - 如何转义 sed 输入文件

bash - 如何拆分字符串取决于其他列中的模式(UNIX 环境)

algorithm - 计算 BASH 中一个文件中两个连续数字的顺序在第二个文件中颠倒的次数

linux - 如何找到句子之间的相似度?

linux - 无法让 cv2 工作 - 即使是最基本的代码

linux - 如何检查我可以通过 ssh 连接到哪些服务器?