Bash - 命令的输出似乎是一个整数,但“[”抱怨

问题描述:

我正在检查远程服务器上的进程是否已被杀死。我正在使用的代码是:Bash - 命令的输出似乎是一个整数,但“[”抱怨

if [ `ssh -t -t -i id_dsa [email protected] "ps -auxwww |grep pipeline| wc -l" | sed -e 's/^[ \t]*//'` -lt 3 ] 
then 
    echo "PIPELINE STOPPED SUCCESSFULLY" 
    exit 0 
else 
    echo "PIPELINE WAS NOT STOPPED SUCCESSFULLY" 
    exit 1 
fi 

然而,当我执行此我得到:

: integer expression expected 
PIPELINE WAS NOT STOPPED SUCCESSFULLY 
1 

返回的实际值是“1”,无空白。我通过以下方式检查了:

vim <(ssh -t -t -i id_dsa [email protected] "ps -auxwww |grep pipeline| wc -l" | sed -e 's/^[ \t]*//') 

然后是仅显示整数和换行符的“:set list”作为返回值。

我不知道为什么这不起作用。

+0

而不是'grep pipeline | wc -l'尝试使用'grep -c pipeline' – anubhava

+0

当我运行该命令时,在数字末尾看到一个'\ r \ n',这可能会导致比较失败。为了快速“修复”它,我通过另一个“sed”管道在第一个之后:'... | sed -e's/\ r * $ //''。然后它没有错误地工作。我不确定'\ r'中有什么东西在折腾。因此,您的整个'ssh'行如下所示:'ssh -t -t -i id_dsa [email protected]“ps -auxwww | grep pipeline | wc -l”| sed -e's/^ [\ t] * //'| sed -e's \\ r * $ //'' – lurker

+0

它增加了额外的\ r,所以你是sed命令的工作。谢谢,我会投你的答案,但你没有发布它作为答案。 –

如果ssh命令的输出结果只是一个前面带有可选选项卡的整数,那么您应该不需要sed命令;在使用它作为-lt运算符的操作数之前,shell会将前导和/或尾随空白除去为不必要的。

if [ $(ssh -tti id_dsa [email protected] "ps -auxwww | grep -c pipeline") -lt 3 ]; then 

这是可能的ssh的结果是不一样的,当你手动运行它时,它在shell中运行的。你可以尝试将其保存在一个变量,所以你可以在你的测试脚本之前,它输出:

result=$(ssh -tti id_dsa [email protected] "ps -auxwww | grep -c pipeline") 
if [ $result -lt 3 ]; 
+0

不知道shell会剥掉多余的空白,谢谢。我试着把它保存到一个变量中(就像你上面写的那样),结果是一样的。 –

+0

'result'的值是什么?如果它是空字符串,就像您原来的错误信息所暗示的那样,那么问题出在您期望通过远程调用返回到'ps'的一组进程。 – chepner

+0

我怀疑这是导致问题的tty分配。对我来说,当连接关闭而不仅仅是返回输出时,这会让ssh报告。 –

你得到的返回值不完全是一个数字。也许有些壳元字符/换行/任何进入这里用自己的方式:当用户mbratch注意到我正在在除了预期的“\ n”返回值“\ r”

#!/bin/bash 

var=$(ssh -t -t -i id_dsa [email protected] "ps auxwww |grep -c pipeline") 

echo $var 

# just to prove my point here 
# Remove all digits, and look wether there is a rest -> then its not integer 
test -z "$var" -o -n "`echo $var | tr -d '[0-9]'`" && echo not-integer 

# get out all the digits to use them for the arithmetic comparison 
var2=$(grep -o "[0-9]" <<<"$var") 

echo $var2 


if [[ $var2 -lt 3 ]] 
then 
    echo "PIPELINE STOPPED SUCCESSFULLY" 
    exit 0 
else 
    echo "PIPELINE WAS NOT STOPPED SUCCESSFULLY" 
    exit 1 
fi 

。所以我改变了我的sed脚本,以便删除“\ r”而不是空格(chepner指出这是不必要的)。

sed -e 's/\r*$//'