2016-11-30 57 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}\""