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

выходе 'Баш -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}\""