凌乱的bash变量

时间:2010-03-18 18:19:20

标签: bash awk

我正在写一个脚本来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”命令未找到等的错误,好像在那里有一个新行。

2 个答案:

答案 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")