我正在检查远程服务器上的进程是否已被杀死。我正在使用的代码是:
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”,它只显示整数和换行符作为返回值。
我在这里不知道为什么这不起作用。
答案 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*$//'