我的 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/