bash dodaje dodatkowe pojedyncze cytaty

14

Mam problem z wykonaniem skryptu.
Podczas wykonywania go w trybie debugowania (bash -x) widzę, że bash dodaje dodatkowe cudzysłowy. Dlatego mój skrypt nie działa.

Tutaj jest to w moim skrypcie:

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}

To jest wynik:

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"'
użytkownik2452585
źródło

Odpowiedzi:

9

Bash wyświetla pojedyncze cudzysłowy, aby pokazać polecenie, które jest poprawną składnią wejściową. Nie jest uruchomione polecenie, które zawiera te pojedyncze cudzysłowy w parametrze sshpolecenia.

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

mówi, że ostatnie 4 parametry polecenia ssh są "sudo, /home/pi/shared/blink.sh, 27i off".

Na zdalnym hoście demon ssh łączy słowa poleceń ze spacjami jako separator, więc wykonywane polecenie zdalne jest

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

Próba wykonania polecenia o nazwie sudo /home/pi/shared/blink.sh 27 off, która oczywiście nie istnieje.

Usuń podwójne cudzysłowy z definicji testvar.

Tutaj nie ma to znaczenia, ale prawdopodobnie ma to znaczenie w twoim prawdziwym przypadku: zamiast ${testvar}pisać "$testvar"(lub "${testvar}"jeśli chcesz, ale nawiasy klamrowe są opcjonalne). Zawsze umieszczaj podwójne cudzysłowy wokół podstawień zmiennych, chyba że wiesz, dlaczego musisz je pominąć. "$testvar"rozwija się do wartości zmiennej testvar, a $testvargdy nie jest cudzysłowem, traktuje wartość testvarjako listę wzorców globu oddzieloną spacjami.

Gilles „SO- przestań być zły”
źródło
3

Myślę, że powinieneś użyć:

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}"

To działa dla mnie:

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

Ale jeśli napiszę tak samo jak ty, otrzymam ten sam zły wynik:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"
Radu Rădeanu
źródło
Cytaty są kluczowe, ponieważ są mechanizmem powłoki do grupowania kilku słów w celu utworzenia pojedynczego argumentu.
glenn jackman
2

Shell dzieli wartość zmiennej na słowa. Cytuj dwukrotnie, aby zapobiec podziałowi. Zobacz różnicę:

t='"a b c"'
set -xv
echo $t
echo "$t"
choroba
źródło