Linux bash错误:2:需要整数表达式

Linux bash错误:2:需要整数表达式,linux,bash,shell,integer,debian,Linux,Bash,Shell,Integer,Debian,我对简单的bash脚本有一个问题 #!/bin/bash libc_main_ver=$(dpkg -l |grep libc6 |awk '{print$3}' |awk -F . '{print$1}'|xargs -n 1) if [ "$libc_main_ver" -eq 2 ] ;then echo ok else echo nope fi exit 0 当我尝试执行脚本时,会出现以下错误: 2: integer expression expected 有什么问题吗 dpkg

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

#!/bin/bash
libc_main_ver=$(dpkg -l |grep libc6 |awk '{print$3}' |awk -F .
'{print$1}'|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$3}' |awk -F . '{print$1}'|xargs -n 1
这只打印2个值,而不打印其他值

一些建议?

插入

echo "<$libc_main_ver>"
其中,^R是用CTRL-V CTRL-R输入的文本回车。要验证或排除此项,请运行od-bc nameofyourscript

echo "<$libc_main_ver>"

其中,^R是使用CTRL-V CTRL-R输入的文本回车符。要验证或排除此项,请运行od-bc nameofyourscript

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

如果您尝试了以下方法:

#!/bin/bash
libc_main_vers=$(dpkg -l | grep libc6 | awk '{ print $3 }' | awk -F . '{ print $1 }')
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 $3 }')

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

以下是另一个版本:

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

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,或者只是验证其中至少有一个有主版本号2

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

dpkg -l 'libc6*' | awk '$3 !~ /^2\./ { exit 1 }' && echo ok || echo nope
如果您只对满足条件的一个包感到满意,请更改为

dpkg -l 'libc6*' | awk '$3 ~ /^2\./ { exit 0 } END { exit 1 }' && echo ok || echo nope
一如往常,foo&&success | | failure是

if foo; then
    success
else
    failure
fi
如果您的真实脚本需要做一些比只回显一个值更复杂的事情,那么长手稿可能是有意义的


请注意,dpkg-l的输出不一定适合脚本。可能使用dpkg query-f'${Version}\n'-W'libc6'来增强健壮性。

不清楚您是否要求列出的所有软件包都有一个主版本号2,或者只是验证其中至少有一个有主版本号2

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

dpkg -l 'libc6*' | awk '$3 !~ /^2\./ { exit 1 }' && echo ok || echo nope
如果您只对满足条件的一个包感到满意,请更改为

dpkg -l 'libc6*' | awk '$3 ~ /^2\./ { exit 0 } END { exit 1 }' && echo ok || echo nope
一如往常,foo&&success | | failure是

if foo; then
    success
else
    failure
fi
如果您的真实脚本需要做一些比只回显一个值更复杂的事情,那么长手稿可能是有意义的



请注意,dpkg-l的输出不一定适合脚本。可能使用dpkg查询-f'${Version}\n'-W'libc6'来增强健壮性。

dpkg-l|grep libc6输出什么?ii libc6:amd64 2.13-38+deb7u7 amd64嵌入式GNU C库:共享库和其他libc依赖,但ofc超过500个字符:aargh!这只打印了2个非其他值,具有极大的误导性。这只打印几个2,没有其他值“2”。当然,2不等于2。显然,您还没有准确地写出所打印的内容,从而弄糟了错误消息。下次遇到问题时,请非常小心地执行此操作。谢谢。dpkg-l | grep libc6输出什么?ii libc6:amd64 2.13-38+deb7u7 amd64嵌入式GNU C库:共享库和其他libc依赖项,但ofc超过500个字符:啊!这只打印了2个非其他值,具有极大的误导性。这只打印几个2,没有其他值“2”。当然,2不等于2。显然,您还没有准确地写出所打印的内容,从而弄糟了错误消息。下次遇到问题时,请非常小心地执行此操作。谢谢。当然,它只打印2。。我真的还是不明白问题出在哪里……如果我去掉双引号,它会给我太多的争论error@Nhoya如果去掉引号会导致参数过多错误,$libc_main_ver包含的不仅仅是字符串2。在比较失败之前添加此回音时,向我们显示其输出。可能确实存在看不见的有趣角色。要进行测试,请向我们显示echo | od-b/foo./foo的结果:第4行:[:2 2:整数表达式预期为0000000 074 062 012 062 012 062 012 062 012 062 062 076 012 0000014当然它只打印2..我真的不明白问题出在哪里…如果我去掉双引号,它会给我太多的论证error@Nhoya如果删除引号会导致参数错误过多,则$libc_main_ver包含的不仅仅是字符串2。在比较失败之前添加此echo时,向我们显示此echo的输出。其中可能确实存在不可见的有趣字符。要进行测试,请向我们显示echo | od-b/foo./foo的结果:第4行:[:2:整数表达式应为0000000 074 062 012 062 012 062 012 062 012 062 076 012 0000014不带-f3 libc6:amd64 libc6:i386 libc6 dev:amd64 libc6-i386 libc6-i686:i386 it打印名称和体系结构,带-f2 nothing getparsed@Nhoya,对不起,我没有Ubuntu,所以我是根据你在co
梅门特。这是glibc:ii libc6:amd64 2.13-38+deb7u7 amd64嵌入式GNU C库:共享库的确切版本吗?Debian,不是Ubuntu。。btw ii libc6:amd64 2.13-38+deb7u7 amd64 Embedded GNU C Library:Shared libraries@Nhoya,我发现一个铸币盒,发现单词之间有多个空格,这就是剪切失败的原因。所以我把它改为awk而不是deadok,它可以工作,但它只给我一个结果。。dpkg-l | grep libc6给了我4行,然后我需要4 2,而不仅仅是一个uups头-n 4 10Nope与-f3 libc6:amd64 libc6:i386 libc6 dev:amd64 libc6-i386 libc6-i686:i386它打印名称和架构,而与-f2无关parsed@Nhoya,对不起,我没有Ubuntu,所以我是根据你在评论中发布的内容来做的。这是glibc:ii libc6:amd64 2.13-38+deb7u7 amd64嵌入式GNU C库:共享库的确切版本吗?Debian,不是Ubuntu。。btw ii libc6:amd64 2.13-38+deb7u7 amd64 Embedded GNU C Library:Shared libraries@Nhoya,我发现一个铸币盒,发现单词之间有多个空格,这就是剪切失败的原因。所以我把它改为awk而不是deadok,它可以工作,但它只给我一个结果。。dpkg-l | grep libc6给我4行,然后我需要4 2,而不仅仅是一个uups头部-n 4 10