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

Bash-命令的输出似乎是一个整数,但是;[“抱怨”,bash,scripting,Bash,Scripting,我正在检查远程服务器上的进程是否已被终止。我使用的代码是: if [ `ssh -t -t -i id_dsa headless@remoteserver.com "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 SUCCESSFU

我正在检查远程服务器上的进程是否已被终止。我使用的代码是:

if [ `ssh -t -t -i id_dsa headless@remoteserver.com "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 headless@remoteserver.com "ps -auxwww |grep pipeline| wc -l" | sed -e 's/^[ \t]*//')

vim如果
ssh
命令的输出实际上只是一个带可选制表符的整数,那么您不应该需要
sed
命令;shell将在将前导和/或尾随空格用作
-lt
操作符的操作数之前,将其去除为不必要的空格

if [ $(ssh -tti id_dsa headless@remoteserver.com "ps -auxwww | grep -c pipeline") -lt 3 ]; then
手动运行ssh的结果可能与在shell中运行时的结果不同。您可以尝试将其保存在变量中,以便在脚本中测试之前输出:

result=$( ssh -tti id_dsa headless@remoteserver.com "ps -auxwww | grep -c pipeline" )
if [ $result -lt 3 ];

您得到的返回值不完全是一个数字。这里可能有一些shell元字符/linefeed/任何其他字符:

#!/bin/bash

var=$(ssh -t -t -i id_dsa headless@remoteserver.com "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
!/bin/bash
var=$(ssh-t-t-i id_dsa)headless@remoteserver.com“ps auxwww | grep-c管道”)
echo$var
#只是为了证明我的观点
#删除所有数字,看看是否有一个rest->然后它不是整数
测试-z“$var”-o-n“`echo$var|tr-d'[0-9]`”&&echo非整数
#取出所有数字,用于算术比较

var2=$(grep-o“[0-9]”用户mbratch注意到,除了预期的“\n”之外,我在返回值中还得到了一个“\r”。因此,我更改了sed脚本,使它去掉了“\r”而不是空格(切普纳指出这是不必要的)


当我运行命令时,尝试使用
grep-c pipeline
而不是
grep-pipeline | wc-l
,我在数字的末尾看到一个
\r\n
,这可能会导致比较失败。要“修复”它很快,我在另一个
sed
中通过管道,在第一个之后:
..sed-e的/\r*$/'
。然后它就正常工作了。我不确定
\r
中抛出了什么。所以你的整个
ssh
行看起来像:
ssh-t-I id\u dsaheadless@remoteserver.com“ps-auxwww | grep管道| wc-l”|sed-e的/^[\t]*/'|sed-e的/\r*$/'
它添加了额外的\r,所以你的sed命令有效。谢谢,我会投票支持你的答案,但你没有把它作为答案发布。你为什么在ssh命令中强制tty分配?这应该只对基于屏幕的命令是必需的,这些命令是“ps”不是。去掉它,您的整个命令就会变得更简单,因为您不需要sed。我不知道shell会去掉多余的空格,谢谢。我已经尝试将它保存到变量中(与上面所写的完全相同)结果是一样的。
result
的值是多少?如果它是空字符串,正如您最初的错误消息所暗示的,那么问题在于远程调用
ps
时希望返回的进程集。我怀疑是tty分配导致了问题。对我来说,这使得ssh报告en连接关闭,而不仅仅返回输出。
sed -e 's/\r*$//'