我正在写一个脚本来ssh到一个机器列表并将一个变量与另一个值进行比较..我遇到了一个问题(我有几个解决方法,但此时我只是想知道为什么这种方法不起作用。)
VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
($ i将是主机名。主机是受信任的,没有给出密码提示)
foo.txt示例:
foo:123456:abcdef
bar:789012:ghijkl
baz:345678:mnopqr
我认为这是引号的问题,或者需要某处。我已经尝试了几种方法(不同的引用,使用$()而不是``等),但似乎无法正确。我的脚本使用以下代码正常工作:
VAR=`ssh $i "grep bar /local/foo.txt" | awk -F: '{print \$2}'`
就像我说的那样,只是一种好奇心,任何回应都会受到赞赏。
忘了发布我的输出:awk吐出整个匹配的行,而不是第二部分。使用引号和\有点我似乎得到一个关于“{print”命令未找到等的错误,好像在那里有一个新行。
答案 0 :(得分:5)
sshd给你命令bash执行,所以它将通过远程端的bash解释器以及你正在执行脚本的那一侧。让我们来看看你的命令:
VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
您已正确转义本地计算机的$2
,因此您正在执行的bash脚本无法解释它。但是所有的引用都会在它变为awk时被删除(我不完全确定为什么内部引号会被删除)并且它正在执行它:
awk -F: /^bar/ {print $2} /local/foo.txt
远程端的bash看到$ 2并用空字符串替换它,留下你的信息:
awk -F: /^bar/ {print } /local/foo.txt
这就是它打印整条线的原因。那么你如何解决它?你可以通过斜杠来逃避远程端的bash将执行:
VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \\\$2}' /local/foo.txt"`
此外,你可以回复命令,看看你正在执行什么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
答案 1 :(得分:0)
尝试尽可能使用$()
语法
VAR=$(ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt")