bash додає додаткові одиничні цитати


14

У мене проблема з виконанням сценарію.
Виконуючи його в режимі налагодження (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"'

Відповіді:


9

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"

Цитати мають вирішальне значення, оскільки вони є механізмом оболонки, щоб згрупувати кілька слів разом, щоб сформувати єдиний аргумент.
glenn jackman

2

Shell розбиває значення змінної на слова. Подвійне котирування, щоб запобігти розщепленню. Дивіться різницю:

t='"a b c"'
set -xv
echo $t
echo "$t"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.