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

时间:2013-07-31 16:47:51

标签: 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 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]*//')

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

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

3 个答案:

答案 0 :(得分:1)

如果ssh命令的输出实际上只是一个以可选选项卡开头的整数,那么您不需要sed命令; shell将把前导和/或尾随空格剥离为不必要,然后再将其用作-lt运算符的操作数。

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

当您在shell中运行时,ssh的结果可能与手动运行时的结果不同。您可以尝试将其保存在变量中,以便在脚本中测试之前输出它:

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

答案 1 :(得分:0)

您获得的返回值并非完全是数字。也许有些shell-metacharacter / 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

答案 2 :(得分:0)

正如用户mbratch注意到,除了预期的“\ n”之外,我在返回值中得到了“\ r”。所以我改变了我的sed脚本,以便它删除了“\ r”而不是空格(chepner指出这是不必要的)。

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