我想得到一个命令的标准错误,并比较它是否包含一些字符串:我创建了这个脚本:
SONARQUBE_SCANNER_HOME=/var/lib/sdon
if msg=$(/var/lib/dtt 2>&1)
then
echo "Command has is working fine!"
else
if [[ "$(echo $msg | grep -i 'No such file or directory')" = 'No such file or directory' ]]
then
echo "Command Path was not found. Not a code issue! Build will now be UNSTABLE!"
exit 0
else
echo "It is something else"
fi
fi
~
但是输出是
+ SONARQUBE_SCANNER_HOME=/var/lib/sdon
++ /var/lib/dtt
+ msg='test: line 4: /var/lib/dtt: No such file or directory'
++ echo test: line 4: /var/lib/dtt: No such file or directory
++ grep -i 'No such file or directory'
+ [[ test: line 4: /var/lib/dtt: No such file or directory = No such file or directory ]]
+ echo 'It is something else'
正如你所看到的,由于一些奇怪的原因,它无缘无故地分裂了没有这样的文件或目录。最后只是将命令的错误与某个字符串进行比较,但这似乎失败了。
if [[ "$(echo $msg | grep -i 'No such file or directory')" = 'No such file or directory' ]]
应为if grep --ignore-case --quiet 'No such file or directory' <<< "$msg"
:
grep
返回整行;测试:第4行:/var/lib/dtt:";位,它不等于您在[[
命令中查找的文本。您可以使用--only-matching
只打印行中与正则表达式匹配的部分- 如果
grep
找到匹配项,则退出并返回代码0 - 由于您不需要打印匹配项(并加快在较大输入中的存在性检查(,因此可以使用
--quiet
在找到匹配项后立即退出,而无需打印 if
只检查命令是否在返回退出代码零后。[[
只是另一个命令,与grep
类似- 长选项名称(虽然在
grep
的所有化身中都不可用(使命令的作用变得明显,而不是模糊 - 您很少需要使用
echo
(或cat
,另一个经常被滥用的命令(来将内容发送到标准的命令输入。这里的字符串在这种情况下很方便 - 最后,使用更多报价™ :)