我有一个用“ ”包裹的 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
"
丑陋。。