我将以下行作为更大的bash脚本的一部分:
if [ `packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` -eq 1 ]
运行脚本后,我得到:
./ install.sh:line 219:[: - eq:一元运算符预期
第219行是上面的行。有任何修复建议吗?
答案 0 :(得分:28)
当您通过test
使用[
内置并且左侧表达式返回NUL时会发生这种情况。您可以使用以下方法解决此问题:
if [ x`some | expression | here` = x1 ]; then
或者,既然你已经在使用bash,你可以使用它没有这个问题的更好的(( ))
语法并执行:
if (( $(some | expression | here) == 1 )); then
请注意,我还使用$()
来替换反引号命令,因为后者是非POSIX并且已弃用
答案 1 :(得分:23)
您可以在不使用任何其他语法的情况下运行命令。例如,以下检查grep的退出代码以确定正则表达式是否匹配:
if ! grep -q "$word" /usr/share/dict/words
then
echo "Word $word is not valid word!"
fi
答案 2 :(得分:8)
发生错误是因为您的命令替换没有任何效果,使您的测试看起来像:
if [ -eq 1 ]
解决这个问题的常用方法是在等式的两边附加一些常量,这样任何操作数都不会在任何时候变空:
if [ x`packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` = x1 ]
请注意,正在使用=
,因为我们现在正在比较字符串。
答案 3 :(得分:6)
您可以在比较的两边添加“x”,或者您可以引用左侧:
[ "$(command | pipeline)" = 1 ]
我不明白最后的cut
和sed
是什么。管道中wc -l
的输出只是一个数字。
答案 4 :(得分:4)
尝试[[test_expression]];而不是[test_expression];