为什么另一个字符串中的字符串在bash / ssh中分割?

时间:2016-11-30 01:45:35

标签: bash ssh

我学会了如何使用以下格式的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" $ {pattern}" " $ {文件}""被解释为以下3个字符串

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

为什么字符串会像那样分裂?什么是解决方案?请告诉我他们。非常感谢你。

2 个答案:

答案 0 :(得分:2)

未转义的引号不会嵌套。

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

答案 1 :(得分: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}因为如果它包含多个文件,则应将其视为单独的参数。