我在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 ..
有什么想法吗?
感谢。
答案 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]
<强>参考强>
引用[ this ]回答:
((...))
使您可以省略整数和数组变量上的美元符号,并在运算符周围包含空格以提高可读性。在这样的语句中,空变量也自动默认为0。
"0$output"
开头的零点可以帮助您处理空$output
的有趣强>
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 ))"
将为缺失值产生零。
然后将存储在输出中的结果数字与限值进行比较,并打印相应的输出。