bash ekstra tek tırnak ekler


14

Betiğimi yürütürken bir sorunum var.
Hata ayıklama modunda (bash -x) yürütürken, bash'ın ekstra tırnak eklediğini görebiliyorum. Bu yüzden senaryom başarısız oluyor.

İşte bu benim script içinde:

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}

Bu çıktı:

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

Yanıtlar:


9

Bash, geçerli giriş sözdizimi olan bir komutu göstermek için tek tırnaklar gösteriyor. Komutun bir parametresinde bu tek tırnakları içeren bir komut çalıştırmıyor ssh.

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

ssh komutunun son 4 parametreler olduğunu söyler "sudo, /home/pi/shared/blink.sh, 27ve off".

Uzak ana bilgisayarda, ssh arka plan programı, boşluklu komutların sözcüklerini ayırıcı olarak birleştirir, böylece yürüttüğünüz uzak komut

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

Bu, adı sudo /home/pi/shared/blink.sh 27 offolan, elbette var olmayan bir komutu yürütmeye çalışır .

Çift tırnak işareti tanımınızdan kaldırın testvar.

Burada önemli değil, ama muhtemelen gerçek durumunuzda önemlidir: bunun yerine ${testvar}, yazın "$testvar"(veya "${testvar}"isterseniz ancak parantez isteğe bağlıdır). Bunları neden dışarıda bırakmanız gerektiğini bilmiyorsanız, değişken ikamelerin her zaman çift tırnak içine alın. "$testvar"değişken değere genişler testvar, oysa $testvardeğilken çift tırnak davranır değeri testvarGlob desen gibi bir boşluk ile ayrılmış listesi.


3

Bence kullanmalısın:

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

Bu benim için çalışıyor:

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

Ama aynı senin gibi yazarsam, aynı yanlış sonucu alıyorum:

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

Tırnak işaretleri çok önemlidir, çünkü kabuğun tek bir argüman oluşturmak için birkaç kelimeyi bir araya getirme mekanizmasıdır.
glenn jackman

2

Kabuk, değişkenin değerini kelimelere böler. Bölmeyi önlemek için iki kez tırnak içine alın. Farkı gör:

t='"a b c"'
set -xv
echo $t
echo "$t"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.