bash error: 2: integer expression expected

bash error: 2: integer expression expected

我对一个简单的 bash 脚本有疑问..

#!/bin/bash
libc_main_ver=$(dpkg -l |grep libc6 |awk '{print}' |awk -F .
'{print}'|xargs -n 1)
if [ "$libc_main_ver" -eq 2 ] ;then
echo ok
else 
echo nope
fi
exit  0

当我尝试执行脚本时出现错误:

2: integer expression expected

有什么问题?

dpkg -l |grep libc6 |awk '{print}' |awk -F . '{print}'|xargs -n 1

这只会打印 2 个值,不会打印其他值。

有什么建议吗?

插入

echo "<$libc_main_ver>"

在第一行之后错误会很明显。很可能那里有一个 space 或换行符,你不应该在数字上与 2.

进行比较

非常深奥:问题也可能出在 -eq 2 中的文字上。如果后面跟一个回车 return 字符,我可以稍微重现您的错误消息:

$ test "2" -eq 2^R
bash: test: 2: integer expression expected 

其中 ^R 是用 CTRL-V CTRL-R 输入的文字回车 return。要验证或排除这一点,运行 od -bc nameofyourscript

如果你尝试这样做会怎样:

#!/bin/bash
libc_main_vers=$(dpkg -l | grep libc6 | awk '{ print  }' | awk -F . '{ print  }')
for ver in ${libc_main_vers}; do
    if (( ver == 2 )); then
        echo ok
    else
        echo nope
    fi
done
exit 0

这是另一个版本:

#!/bin/bash
libc_full=$(dpkg -l | grep libc6 | head -n 1 | awk '{ print  }')

libc_main=$(echo ${libc_full} | grep -o "^[0-9]*")
libc_update=$(echo ${libc_full} | grep -o "[0-9]*$")

if (( libc_main == 2 )); then
    echo "Main version is OK"
    if (( libc_update >= 7 )); then
        echo "Update version is OK"
        exit 0
    fi
fi
exit 1

不清楚您是要求列出的所有软件包都具有主版本号 2,还是只是验证其中至少有一个如此。

无论如何,如果我们从 grep foo | awk { print } 通常可以重构为单个 Awk 脚本 awk '/foo/ { print }' 的观察开始,我们就可以简化您的脚本;但有时将其基本上全部重构为 Awk 是有意义的。大概是这样的:

dpkg -l 'libc6*' | awk ' !~ /^2\./ { exit 1 }' && echo ok || echo nope

如果您对只有一个包裹符合条件感到满意,请更改为

dpkg -l 'libc6*' | awk ' ~ /^2\./ { exit 0 } END { exit 1 }' && echo ok || echo nope

一如既往,foo && success || failure 是 shorthand 对于

if foo; then
    success
else
    failure
fi

如果您的真实脚本需要做一些比回显值更复杂的事情,那么普通写法可能有意义。

请注意,dpkg -l 的输出不一定适合脚本。也许使用 dpkg-query -f '${Version}\n' -W 'libc6' 代替稳健性。