我正在编写一个脚本来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"命令未找到等的错误,好像在某处有一个新行.
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)