2016-11-30 15 views
1

私は別の文字列の文字列がbash/sshで分割されているのはなぜですか?

、だから私は 'bashの-x test.sh' の出力は以下の通りです

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

、次のコードをした、次の形式でsshを使用する方法を

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

を学びました

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

バッシュは変数を置き換え、引用符で囲まれていないものとして扱います。第二に、エスケープせずに引用符内で引用符を使用することはできません。 (

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

、次いで白スペースで区切られていない文字列が一つに連結されるであろう:

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

は、(第2の引用は、文字列の終わりとして扱われることになる)に変換されるであろう、このコマンドを注引用符の内側のスペースは区切り文字ではありません)。したがって、私たちは、私はそれが必要のため${file}が引用されてはならないと思いますが、これを解決するための内部引用符をエスケープするか、単に引用

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

または

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

の別の種類を使用するには

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

を得ました複数のファイルが含まれている場合は、分離された引数として扱われます。

+0

詳しい仕組みを教えていただきありがとうございます。それは非常に明確な説明です。 – mora

2

エスケープされていない引用符はネストされません。

ssh "${address}" "grep \"${pattern}\" \"${file}\"" 
関連する問題