凌乱的bash变量

Kyl*_*yle 5 bash awk

我正在编写一个脚本来ssh到一个机器列表并将一个变量与另一个值进行比较..我遇到了一个问题(我有几个解决方法,但此时我只是想知道为什么这个方法不是不工作.

VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
Run Code Online (Sandbox Code Playgroud)

($ i将是主机名.主机是可信的,没有给出密码提示)

foo.txt的示例:

foo:123456:abcdef
bar:789012:ghijkl
baz:345678:mnopqr
Run Code Online (Sandbox Code Playgroud)

我假设它是引号的问题,或者需要某个地方.我已经尝试了几种方法(不同的引用,使用$()而不是``等),但似乎无法正确.我的脚本使用以下代码正常工作:

VAR=`ssh $i "grep bar /local/foo.txt" | awk -F: '{print \$2}'`
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,只是一种好奇心,任何回应都会受到赞赏.

忘了发布我的输出:awk吐出整个匹配的行,而不是第二部分.使用引号和"有点"我似乎得到一个关于"{print"命令未找到等的错误,好像在某处有一个新行.

ind*_*div 5

sshd给你命令bash执行,所以它将通过远程端的bash解释器以及你正在执行脚本的那一侧.我们来看看你的命令:

VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
Run Code Online (Sandbox Code Playgroud)

您已正确转义$2本地计算机,以便您正在执行的bash脚本不会解释它.但是当它到达awk时,所有的引用都被删除了(我不完全确定为什么内部引号被删除)并且它正在执行:

awk -F: /^bar/ {print $2} /local/foo.txt
Run Code Online (Sandbox Code Playgroud)

远程端的bash看到$ 2并用空字符串替换它,让你这样:

awk -F: /^bar/ {print } /local/foo.txt
Run Code Online (Sandbox Code Playgroud)

这就是它打印整条线的原因.那么你如何解决它?你可以通过斜杠来逃避远程端的bash执行,如下所示:

VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \\\$2}' /local/foo.txt"`
Run Code Online (Sandbox Code Playgroud)

此外,您只需回显命令即可查看正在执行的bash,以便调试您遇到的任何其他问题:

VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
echo VAR1: $VAR1

Execute it and see this output and see right away that it has removed $2:
VAR1: awk -F: /^bar/ {print } /local/foo.txt
Run Code Online (Sandbox Code Playgroud)