为什么 grep 不能使用单引号?

为什么 grep 不能使用单引号?

我有一个用“ ”包裹的 bash 脚本,因此我需要在 grep 命令中使用“ ”,但它不起作用。我无法切换引号,因为这样变量就不会展开。

#!/bin/bash

PWD=`pwd`
source "$PWD/AWS.config.sh"

SCRIPT="
cd ~/$APP_PATH;
netstat -ln | grep ':80 ' &> /dev/null;
if [ $? -eq 0 ]; then
    echo something on 80;
else
    echo nothing on 80;
fi
"
ssh -i $EC2_PEM_FILE $APP_HOST $SCRIPT

所以

netstat -ln | grep ':anyporthere ' &> /dev/null;

似乎总是返回 $? 作为 0,暗示匹配,但实际上却没有。

正如我提到的,如果我将封闭脚本切换到“ ”和“ ”,它可以工作,但脚本变量不会扩展,这是一个问题。

请帮忙。

答案1

$?分配变量时会替换脚本中的变量,而不是在远程主机上替换

#!/bin/bash
source "$PWD/AWS.config.sh"

ssh -i "$EC2_PEM_FILE" "$APP_HOST" << END_SCRIPT
    cd ~/"$APP_PATH"
    netstat -ln | grep -q ':80 '
    if [ \$? -eq 0 ]; then
        echo something on 80
    else
        echo nothing on 80
    fi
END_SCRIPT
  • 已经有一个名为 PWD 的 bash 变量,因此您不需要为其分配。
  • 养成引用变量的习惯,除非你知道什么时候不这样做。
  • grep -q很安静,但返回相同的退出状态。也更高效,因为如果找到匹配项,它会立即退出,而不是搜索文件的其余部分。
  • 你需要cd跑步吗netstat

您还可以使用短路布尔运算符:

ssh -i "$EC2_PEM_FILE" "$APP_HOST" "netstat -ln | grep -q ':80 ' && echo something on 80 || echo nothing on 80"
END_SCRIPT

答案2

通过将字符串与不同的引号连接起来来解决。虽然有点不靠谱。还是希望有一个更好的解决方案

SCRIPT="
blah;
blah;
"
SCRIPT+='
this grep bit " "
'

SCRIPT+="
the rest
"

丑陋。。

相关内容