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'
代替稳健性。
我对一个简单的 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'
代替稳健性。