2010-03-18 100 views
5

我正在寫一個腳本來ssh進入機器列表並將一個變量與另一個值進行比較..我遇到了一個問題(我有幾個解決方法,但在這一點上我是隻是想知道爲什麼這種方法不起作用)。凌亂的bash變量

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

($我會是一個主機名的主機是值得信賴的,沒有密碼提示中給出。)foo.txt的的

例子:

foo:123456:abcdef 
bar:789012:ghijkl 
baz:345678:mnopqr 

我假定這是一個問題用引號,或者在某處需要。我試了幾種方法(不同的引用,使用$()而不是``等),但似乎無法做到。我的腳本正在使用以下工作正常:

VAR=`ssh $i "grep bar /local/foo.txt" | awk -F: '{print \$2}'` 

就像我說的,只是一個好奇心,任何反應表示讚賞。

忘了發佈我的輸出結果:awk正在吐出整個匹配的行,而不是第二部分。用引號和\'有點玩,我似乎得到了關於「{打印」命令找不到等錯誤,就好像有一個新的行在那裏。

+0

你可能會得到更多的ServerFault響應,關係到我的問題有:http://serverfault.com/ques tions/99886/ssh-not-redirecting -stdout-to-local-terminal – 2010-03-18 18:27:36

+0

如果從第一個示例中刪除插入符號,會發生什麼情況?也許在這條線的開頭有一個看不見的角色。 – danben 2010-03-18 18:29:02

+0

@Lance Roberts - 這個問題是關於awk,而不是ssh,因此適用於堆棧溢出。 – danben 2010-03-18 18:29:29

回答

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"` 

另外,你可以只回聲命令,看看有什麼慶典是真正執行爲你調試你再進一步的問題跨越:

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 
+0

這不是引號被任意刪除,而是遠程端的shell正在解釋它們。編寫命令行。引用它的遠程外殼。引用它的本地外殼。 – 2010-03-18 20:40:39

+0

Ahhh我很近!謝謝! – Kyle 2010-03-18 20:45:01

+0

@Chris Johnsen:當我通過''...'{print \ $ 2} \'..''試驗時,我迷惑了自己。我在遠程方面看到它在表達式周圍有正確的''',但$ 2'仍然缺失。但在閱讀你所說的內容之後,它是有道理的,因爲它正在用'''替換'\',同時它會替代'$ 2'。我知道這不是魔術,我無法馬上解釋它。 ;)謝謝澄清。 – indiv 2010-03-18 21:08:28

0

嘗試儘可能使用$()語法

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