【问题标题】:[: : integer expression expected[: : 需要整数表达式
【发布时间】:2015-06-15 21:17:09
【问题描述】:
COUNTER=0    
    let COUNTER=COUNTER+1
    count=`ssh -i /var/www/.ssh/id_rsa_root -o stricthostkeychecking=no $host $cmd`
    count1=`echo $count | awk '{print $4}'`
    printf "count1 : $count1\n"
    result1=${count1/.*}
    if [ "$result1" -ge "0" ]; then
            echo $host 
    else
            echo $host
            exit
    fi

如果$result1 的值是整数并且大于零,它将进入 IF 循环(对我来说很好)

但是当它不是 INTEGER 时,它将进入 else 循环(它应该这样做),输出中出现以下错误

line 55: [: : integer expression expected

但我不想在我的输出中出现上述错误。我尝试使用2>/dev/null,但没有运气。

请帮忙!

【问题讨论】:

  • shellcheck.net检查你的代码
  • 另外,如果您使用sh -x yourscript 运行它,您将看到 actual 值正在使用中,因此您将能够看到它是如何/为什么不是一个整数。
  • 另外,您使用 printf 错误。不要替换成格式字符串;相反,使用格式字符串告诉系统如何进行替换:printf 'count1: %s\n' "$count1"
  • 您可能需要检查问题的格式/内容 (How to Ask)。
  • 关于确定值是否为 bash 中的整数的主题还有其他问题。

标签: bash if-statement integer


【解决方案1】:

如果您想优雅地处理空结果,请明确检查:

if [ -z "$result1" ]; then
        : "ignoring empty string"
elif [ "$result1" -ge 0 ]; then
        printf '%s\n' "$host" 
else
        printf '%s\n' "$host"
        exit
fi

【讨论】:

    【解决方案2】:

    您还可以在进行算术比较之前检查result1 是否为有效整数:

    function isNumber () {
        [[ $1 =~ ^-?[0-9]+$ ]]
    }
    
    if ! isNumber "$result1"; then
        echo "not a number"
    elif [ "$result1" -ge "0" ]; then
        echo "null or positive"
    else
        echo "negative"
    fi
    

    【讨论】:

    • 您可以考虑改用符合 POSIX 的语法。 isNumber() { case $1 in *[!0-9]*) return 1;; '') return 1;; *) return 0;; esac; } 是一个粗略的草案,但需要更平滑处理负值。
    • @Charles Duffy:我很久以前从 stackoverflow 借用了这个简单的功能。但是,由于有一个更便携的解决方案,我很乐意从现在开始在我的项目中使用它。谢谢!
    【解决方案3】:

    if [ "$result1" -ge "0" ]; then 更改为

    if (( result1 >= 0 )); then
    

    如果result1 未定义(或为空)或以某种方式恰好是string,则此语法不会引发任何错误。

    【讨论】:

    • 可以肯定的是,这是更好的语法(当针对 bash 时),但它真的解决了这里的问题吗?
    • 我相信$result1 根本不是整数。
    • $result1 仅是整数
    • @Pankaj,...是吗?但是在您的问题中,您明确表示问题发生在“不是 INTEGAR 时”。 (如果您提供了一个 exact 值的示例,将会很有帮助)。
    • 它是命令的输出,但是当您没有得到任何输出时,它会抛出 [: : integer expression expected 。我不想在我的终端显示器上出现这个错误。有什么办法可以遮住它吗??
    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多