2016-11-30 68 views
1

我學會了如何通過下面的格式使用ssh,爲什麼另一個字符串中的字符串在bash/ssh中分割?

ssh "${address}" "command run in a remote server" 

所以我做了下面的代碼,

# script name : test.sh 
address='127.0.0.1' 
file="test.txt" 
pattern='Number of records' 
ssh "${address}" "grep "${pattern}" "${file}"" 

的 'bash的-x test.sh' 輸出以下,

ssh 127.0.0.1 'grep Number' of 'records test.txt' 
grep: of: No such file or directory 
grep: records: No such file or directory 
grep: test.txt: No such file or directory 

看來, 「grep的 」$ {}模式「, 」$ {}文件「」 被解釋爲以下3串

(grep Number) + (of) + (records test.txt) 

爲什麼字符串會像這樣分裂?什麼是解決方案?請告訴我他們。非常感謝你。

回答

2

Bash會替換變量,並將其視爲未加引號。其次,你不能在沒有轉義的情況下在引號內使用引號。注意:此命令

"grep "${pattern}" "${file}"" 

會被變換爲(第二報價將被視爲字符串的末尾):

"grep "Number of records" "test.txt"" 

,然後不由白色空格分隔的字符串將被級聯到一個(引號內的空格不是分隔符)。因此,我們得到了

(grep Number) (of) (records test.txt) 

爲了解決這個問題,逃避引號內或只是使用另一種報價

ssh "${address}" "grep \"${pattern}\" ${file}" 

ssh "${address}" "grep '${pattern}' ${file}" 

我覺得${file}不應該被引用爲它應該如果它包含多個文件,則將其視爲分隔參數。

+0

感謝您告訴詳細的機制。這是非常明確的解釋。 – mora

2

未轉義的引號不會嵌套。

ssh "${address}" "grep \"${pattern}\" \"${file}\""