我学会了如何使用以下格式的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)
为什么字符串会像那样分裂?什么是解决方案?请告诉我他们。非常感谢你。
答案 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}
因为如果它包含多个文件,则应将其视为单独的参数。