Bash:if语句中的复杂命令

时间:2017-01-31 18:24:24

标签: bash unix awk sed

我正在编写此脚本,该脚本应在智能测试完成后检测到错误。但我无法让它发现任何错误,当然不是。

 if [[ smartctl --log=selftest /dev/sda | awk 'NR>7 {print $4,$5,$6,$7}' | sed 's/offline//g; s/00%//g' != *"Completed without error"* ]; then
 echo "No error detected"
 else echo "Error detected"
 fi

输出:

./test.sh: line 19: conditional binary operator expected
./test.sh: line 19: syntax error near `--log=selftest'
./test.sh: line 19: `if [[ smartctl --log=selftest /dev/sda | awk 'NR>7 {print $4,$5,$6,$7}' | sed  's/offline//g; s/00%//g' != *"Completed without error"* ]]; then'
显然,我做错了什么。但是所有的教程都说两个[[]]个东西,但我觉得命令很复杂,它不起作用......我怎样才能使它工作?

2 个答案:

答案 0 :(得分:2)

如果要进行子字符串比较,则需要将=!=运算符左侧的字符串传递给{{1} }。

命令替换[[ ]]将用它的输出替换它包含的命令,为你提供一个可以用这种方式进行比较的字符串。

那是:

$()

或者,可读性稍差:

smartctl_output=$(smartctl --log=selftest /dev/sda | awk 'NR>7 {print $4,$5,$6,$7}' | sed 's/offline//g; s/00%//g')
if [[ "$smartctl_output" != *"Completed without error"* ]; then
   : ...put your error handling here...
fi

答案 1 :(得分:2)

你很困惑。如果您要测试的命令是smartctl,请不要将其替换为[[。你想要的,或者两者兼而有之。 (参见例如Bash if statement syntax error

无论如何,管道awksed然后使用shell将结果与另一个字符串进行比较似乎是一种非常迂回的做事方式。与if进行通信的方法是返回错误的非零退出代码。

if smartctl --log=selftest /dev/sda |
   awk 'NR>7 { if ($4 OFS $5 OFS $6 OFS $7 ~ /Completed without error/) e=1; exit }
       END { exit 1-e }'
then
     echo "No error detected"
else
     echo "Error detected"
fi