【问题标题】:Read string and convert to INT (BASH)读取字符串并转换为 INT (BASH)
【发布时间】:2016-11-18 15:00:03
【问题描述】:

我在 Bash 中有一个简单的脚本来读取文件中的数字,然后将其与不同的阈值进行比较。输出是这样的:

: integer expression expected
: integer expression expected
OK: 3

我的代码是这样的:

#!/bin/bash

wget=$(wget http://10.228.28.8/ -O /tmp/wget.txt 2>/dev/null)
output=$(cat /tmp/wget.txt | awk 'NR==6')
#output=7
echo $output

if [ $output -ge 11 ];then
    echo "CRITICAL: $output"
    exit 2
elif [ $output -ge 6 ] && [ $output -lt 11 ];then
    echo "WARNING: $output"
    exit 1
else
    echo "OK: $output"
    exit 0
fi

rm /tmp/wget.txt

我知道问题出在哪里,我知道我正在读取一个字符串并尝试比较一个 int。但我不知道如何读取此文件并将数字转换为 int var 中的读取..

有什么想法吗?

【问题讨论】:

  • 没有问题是你忘了报价。
  • 对不起,这是我的第一篇文章,我不知道如何使用。无论如何感谢您的帮助;)
  • @hectormarina : 你在哪一行得到错误?
  • 运行wget/tmp/wget.txt的内容是什么?
  • 我怀疑你的 wget.txt 有 DOS 行尾...

标签: string bash shell scripting


【解决方案1】:

$output为空字符串时出现问题;无论您是否引用扩展(并且应该),您都会得到整数表达式所需的错误。您需要明确处理空字符串,默认值为零(或任何有意义的默认值)。

wget=$(wget http://10.228.28.8/ -O /tmp/wget.txt 2>/dev/null)
output=$(awk 'NR==6' < /tmp/get.txt)
output=${output:-0}

if [ "$output" -ge 11 ];then
  echo "CRITICAL: $output"
  exit 2
elif [ "$output" -ge 6 ];then
  echo "WARNING: $output"
  exit 1
else
  echo "OK: $output"
  exit 0
fi

(如果你到达elif,你已经知道$output的值小于11,无需再次检查。)


如果output 以回车符结尾,也会出现此问题,并且与错误消息一致。你可以删除它

output=${output%$'\r'}

【讨论】:

  • 但是如果你看他的输出,它会打印OK: 3,这是else条件下的echo "OK: $output"。所以$output 不为空
  • 你可以通过将东西放入 awk 来消除额外的变量赋值。 output=$(awk 'NR==6{printf("%d",$1)}') /tmp/wget.txt
  • 啊,真的。不过,我敢打赌OK: $output= 的输出会很有启发性。值的末尾可能有一个回车。
【解决方案2】:

我对您的代码有一些建议。

你可以明确告诉 bash output 是一个整数

declare -i output # See [1]

改变

output=$(cat /tmp/wget.txt | awk 'NR==6') # See [2]

最好写成

output=$(awk 'NR==6' /tmp/wget.txt )

改变

if [ $output -ge 11 ]

if [ "0$output" -ge 11 ] # See [4]

if (( output >= 11 )) # Better See [3]

参考文献

  1. 检查 bash [ declare ]
  2. 无用的猫。检查[ this ]
  3. 引用[ this ]答案:

    ((...)) 使您可以省略整数和数组变量上的美元符号,并在运算符周围包含空格以提高可读性。在这样的语句中,空变量也自动默认为 0。

  4. "0$output"开头的零帮助你处理空$output

有趣
Useless use of cat 是一个在 SO 中响亮已久的短语。查一下[ this ]
[ @chepner ]在他的[ answer ]中使用[ bash parameter expansion ]处理了空的output惨败,值得一看。

【讨论】:

  • 应该使用引号,但在$output 为空的当前情况下它们无济于事。 (( output &gt;= 11)) 会起作用,因为在这样的语句中,空变量会自动默认为 0。
  • @chepner:谢谢,已更正。
  • 如果$output 为空,您可以使用${output:-0} 将其替换为零。
  • @ghoti :另一个答案已经提到了这种方法。我的方法有明显的缺点吗?
  • @sjsam,如果有 100% 的信心 $output 将始终是一个整数(因此由[ $output -ge ... 等正确解释),您的方法很好。在我自己的 shell 编程中,我总是努力添加错误处理,以便如果输入的结构不符合预期,我们可以检测并控制行为,而不仅仅是失败。您的参考 #3 很棒,但如果 $output 为空,则抛出错误和警告可能会更好。由于 Q 中的脚本看起来像 Nagios 脚本,因此 null/空值可能应该返回 UNKNOWN 响应。
【解决方案3】:

一个简化的脚本:

#!/bin/bash

wget=$(wget http://10.228.28.8/ -O /tmp/wget.txt 2>/dev/null)
output=$(awk 'NR==6' </tmp/wget.txt )

output="$(( 10#${output//[^0-9]} + 0 ))"

(( output >= 11 )) && { echo "CRITICAL: $output"; exit 2; }
(( output >=  6 )) && { echo  "WARNING: $output"; exit 1; }
echo "OK: $output"

清理任何输入的关键是:

output="$(( 10#${output//[^0-9]} + 0 ))"

${output//[^0-9]} 将只留下 0 到 9 之间的数字(将删除所有非数字字符)。

10#${output//[^0-9]}output 转换为以 10 为底的数字。

这将正确转换像0019这样的数字

"$(( 10#${output//[^0-9]} + 0 ))" 将为缺失值生成零。

然后将存储在输出中的结果数字与限制进行比较,并打印相应的输出。

【讨论】:

    【解决方案4】:

    在 BASH 中,对字符串使用双括号是个好主意:

    if [[ testing strings ]]; then
        <whatever>
    else
        <whatever>
    fi
    

    整数或双括号:

    if (( testing ints )); then
        <whatever>
    else
        <whatever>
    fi
    

    例如试试这个:

    var1="foo bar"
    if [ $var1 == 'foo bar' ]; then
        echo "ok"
    fi
    

    结果:

    $ bash: [: too many arguments
    

    现在,这个:

    var2="foo bar"
    if [[ $a == "foo bar" ]]; then
        echo "ok"
    fi
    

    结果:

    ok
    

    为此,您在 BASH 中的代码:

    if [[ $output -ge 11 ]]; then
        echo "CRITICAL: $output"
        exit 2
    elif [[ $output -ge 6 ]]; then
        echo "WARNING: $output"
        exit 1
    else
        echo "OK: $output"
        exit 0
    fi
    

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多