似乎无法转义脚本化的bash命令。每次错误/错误输出

好的,这真杀了我。我知道我必须对双引号进行转义,但是我无法使下面的脚本bash命令正常工作。

在远程服务器上,以下命令可以正常工作:

sed 's|EX_ROOT=/root/$SERVER|EX_ROOT="/root/$SERVER"|g'  /etc/example/config.conf

结果: EX_ROOT =“ / root / $ SERVER”

(这是专门知识)

但是,从这样的其他服务器远程运行命令时:

ssh root@$HWNODEIP "sed 's|EX_ROOT=/root/$SERVER|EX_ROOT="/root/$SERVER"|g' /etc/example/config.conf"

不添加双引号。所以我记得我必须转义双引号。但是我在这里碰壁。无论我尝试什么,都无法获得预期的结果。

示例1:

ssh root@$HWNODEIP "sed 's|EX_ROOT=/root/$SERVER|EX_ROOT="\""/root/$SERVER"\""|g' /etc/example/config.conf"

赠予: EX_ROOT =“ / root /” $ SERVER

($ SERVER不在引号内)

示例2:

ssh root@$HWNODEIP "sed 's|EX_ROOT=/root/$SERVER|EX_ROOT=\"/root/\$SERVER\"|g' /etc/example/config.conf"

赠予: EX_ROOT =“ / root / $ SERVER” $ SERVER

(关闭但仍未达到预期结果)

预期/预期结果:

EX_ROOT="/root/$SERVER"

我不知道我在这里做错了什么。我知道我很亲近,但真的不知道。我尝试了其他一些事情,例如使用更多的引号和尝试进行更多的转义,但是所有操作都没有结果,现在我已经失去了主意...

petar29 回答:似乎无法转义脚本化的bash命令。每次错误/错误输出

您的第一次尝试不会将双引号发送到远程服务器;它们会在本地关闭并重新打开双引号字符串。

您需要逃脱它们。您的示例2是 close ,但是您忘了在正则表达式中转义美元符号,因此在未设置的局部变量sed 's|EX_ROOT=/root/|EXROOT="/root/$SERVER"'扩展为空后,您开始运行SERVER字符串。

ssh root@$HWNODEIP "sed 's|EX_ROOT=/root/\$SERVER|EX_ROOT=\"/root/\$SERVER\"|g' /etc/example/config.conf"
                                         ^
                                         |
                                 backslash here

但是,要就地编辑文件,请使用ed而不是非标准的sed扩展名-i

printf 's|EX_ROOT=$SERVER|EX_ROOT="$SERVER"|g\nwq\n' |
    ssh root@$HWNODEIP 'ed /etc/example/config.conf'

由于ed不必从标准输入中读取要编辑的数据,因此它可以从标准输入中读取 script ,每行一条命令。语法本质上与sed相同。但是,现在,您所需的转义操作要少得多,因为脚本不会暴露给远程端的shell。 (如果wq命令看起来很熟悉,那是因为vi基于ex,而ed基于<assemblyBinding xmlns="">。)

本文链接:https://www.f2er.com/3123588.html

大家都在问