0

我正在尝试编写一个非常简单的 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

4 回答 4

1

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

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

var1=$(ssh username@$i -t "cd /;ls -l|wc -l" 2>/dev/null | sed -e 's/[^0-9]//g')
于 2013-06-18T20:25:05.813 回答
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

The^M是文字回车,点击CtrlvCtrlm

要验证您的数据:

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

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

于 2013-06-18T20:59:59.297 回答
0

失败的原因是没有分配给 var1 或 var1 包含额外的字符。wc这是一个错误,它打印所有缩进到特定位置的东西,所以我通常做的是通过 awk 管道来获取数字。

尝试:

var1=$(ssh username@$i -- "cd /; ls -l | wc -l | awk '{print $1}'")
于 2013-06-18T20:29:40.443 回答
-2

应该这样写

if [ "$var1" > "0" ]

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

整个文件

#!/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
于 2013-06-18T20:28:43.340 回答