Bash добавляет дополнительные одинарные кавычки

13

У меня проблема с выполнением моего скрипта.
При выполнении этого в режиме отладки (bash -x) я вижу, что bash добавляет дополнительные кавычки. Поэтому мой сценарий не работает.

Вот это в моем сценарии:

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}

Это вывод:

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
user2452585
источник

Ответы:

8

Bash отображает одинарные кавычки, чтобы показать команду, которая является допустимым синтаксисом ввода. Это не выполнение команды, которая содержит эти одинарные кавычки в параметре sshкоманды.

ssh  '"sudo' /home/pi/shared/blink.sh 27 'off"'

говорит вам , что последние 4 параметров команды SSH являются "sudo, /home/pi/shared/blink.sh, 27и off".

На удаленном хосте демон ssh объединяет слова команд с пробелами в качестве разделителей, поэтому выполняемая вами удаленная команда

"sudo /home/pi/shared/blink.sh 27 off"

Это пытается выполнить команду с именем sudo /home/pi/shared/blink.sh 27 off, которое, конечно, не существует.

Удалите двойные кавычки из вашего определения testvar.

Здесь это не имеет значения, но, вероятно, это имеет значение в вашем реальном случае: вместо ${testvar}, напишите "$testvar"(или, "${testvar}"если хотите, но фигурные скобки необязательны). Всегда ставьте двойные кавычки вокруг переменных замен, если вы не знаете, почему вам нужно их пропустить. "$testvar"расширяется до значения переменной testvar, тогда как, $testvarесли не заключать в двойные кавычки, обрабатывает значение testvarкак разделенный пробелами список шаблонов глобуса.

Жиль "ТАК - перестань быть злым"
источник
3

Я думаю, что вы должны использовать:

testvar="sudo /home/pi/shared/blink.sh 27 off"
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 "${testvar}"

Это работает для меня:

$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la

Но если я напишу так же, как вы, я получу тот же неправильный результат:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"
Раду Рэдяну
источник
Кавычки имеют решающее значение, потому что они представляют собой механизм оболочки, объединяющий несколько слов в единый аргумент.
Гленн Джекман
2

Оболочка разбивает значение переменной на слова. Сделайте двойную кавычку, чтобы предотвратить расщепление. Увидеть разницу:

t='"a b c"'
set -xv
echo $t
echo "$t"
choroba
источник