读取字符串并转换为INT(BASH)

时间:2016-07-15 11:51:49

标签: string bash shell scripting

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

#!/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

我的代码是:

{{1}}

我知道这是什么问题,我知道我正在阅读一个字符串,我试着比较一个int。但我不知道如何读取此文件并将数字转换为读入int var ..

有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:3)

$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'}

答案 1 :(得分:1)

我的方面有一些关于你的代码的建议。

您可以明确告诉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
  5. 有趣
    Useless use of cat是一个长期以来在SO中响亮的短语。检查[ this ]
    [ @chepner ][ bash parameter expansion ]中使用[ answer ]处理空output惨败,值得一看。

答案 2 :(得分:0)

在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

答案 3 :(得分:0)

简化的脚本:

#!/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 ))"将为缺失值产生零。

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