我正在编写此脚本,该脚本应在智能测试完成后检测到错误。但我无法让它发现任何错误,当然不是。
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'
显然,我做错了什么。但是所有的教程都说两个[[]]
个东西,但我觉得命令很复杂,它不起作用......我怎样才能使它工作?
答案 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)
无论如何,管道awk
到sed
然后使用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