Давайте минимизируем эту проблему (и в процессе ее реализации поймем, что большая часть вашего контекста может быть удалена из вашего вопроса.) Сначала мы определим вспомогательную функцию args
, чтобы понять, как команды разбиваются на слова
$ args() { for x in "$@"; do echo "[$x]"; done; }
$ old=0.0.0.0
$ args ssh root@192.168.0.32 "sed -i '/0 => '192.168.0.32' /a 1 => '$old',' /tmp/test"
[ssh]
[root@192.168.0.32]
[sed -i '/0 => '192.168.0.32' /a 1 => '0.0.0.0',' /tmp/test]
Поэтому один аргумент ("sed -i ..."
) передается в ssh
.Двойные кавычки необходимы для расширения переменной, но мы можем упростить проблему, вставив переменную old
:
$ args sed -i '/0 => '192.168.0.32' /a 1 => '0.0.0.0',' /tmp/test
[sed]
[-i]
[/0 => 192.168.0.32 /a 1 => 0.0.0.0,]
[/tmp/test]
Мы можем упростить это далее
$ args '/0 => '192.168.0.32' /a 1 => '0.0.0.0','
[/0 => 192.168.0.32 /a 1 => 0.0.0.0,]
изаменив сложный аргумент гораздо более простым
$ args 'foo'1'bar'
[foo1bar]
Обратите внимание, что три строки 'foo'
, 1
и bar
объединены в единый мир foo1bar
.А теперь вы можете задать более простой вопрос:
Как мне добавить одинарную кавычку в строку 'foo'1'bar'
?Ответ таков:
$ args 'foo'\'1\''bar'
[foo'1'bar]
Обратите внимание, что "foo'1'bar"
не работает в вашем случае, так как вы уже использовали двойные кавычки для внешней команды ssh
.