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