如果条件在shell脚本中无法正常工作

时间:2013-06-18 20:18:32

标签: shell

我正在尝试编写一个非常简单的shell脚本,如下所示,基本上应该连接到远程服务器并只计算其根目录下的行,与零和&打印输出如下所示,但if条件总是给出错误:

  

预期的整数表达式

这是我的代码:

#!/bin/sh
i=servername
var1=$(ssh username@$i -t "cd /;ls -l|wc -l" 2>/dev/null)
echo $var1   #(gives me a number output e.g 28)
if [ $var1 -gt 0 ]
then
echo "successfuly connected"
else
echo "failed to connect"
fi

4 个答案:

答案 0 :(得分:1)

ssh命令的输出中可能还有其他(可能不可见)字符。

尝试通过sed传递该输出以去除所有非数字:

var1=$(ssh username@$i -t "cd /;ls -l|wc -l" 2>/dev/null | sed -e 's/[^0-9]//g')

答案 1 :(得分:0)

失败的原因是因为没有任何内容被分配给var1或者var1包含额外的字符。 wc是一个bug,它会打印缩进到特定位置的所有内容,所以我通常做的是通过awk管道来获取数字。

尝试:

var1=$(ssh username@$i -- "cd /; ls -l | wc -l | awk '{print $1}'")

答案 2 :(得分:0)

您的数据可能包含尾随回车。我可以重现错误:

$ /bin/sh
sh-4.2$ var1=28
sh-4.2$ [ $var1 -gt 0 ]
sh-4.2$ [ $var1 -gt 0 ] && echo OK
OK
sh-4.2$ var1=28^M
sh-4.2$ [ $var1 -gt 0 ]
: integer expression expected

^M是一个文字回车,点击 Ctrl v Ctrl m

验证您的数据:

printf "%s" "$var1" | od -c

使用@ Nate或@ mplf的建议修剪不需要的字符。

答案 3 :(得分:-2)

应该像这样写

if [ "$var1" > "0" ]

查看下面的http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html 7.1.2.2。数字比较

整个文件

#!/bin/sh
i=servername
var1=$(ssh username@$i -t "ls -l|wc -l" 2>/dev/null)
echo $var1
if [ "$var1" > "0" ]
then
echo "successfuly connected"
else
echo "failed to connect"
fi

给了我

29
successfuly connected