ทุบตีเพิ่มคำพูดเดียวพิเศษ


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, และ27off"

บนรีโมตโฮสต์ ssh daemon รวมคำของคำสั่งที่มีช่องว่างเป็นตัวคั่นดังนั้นคำสั่งระยะไกลที่คุณกำลังดำเนินการคือ

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

ความพยายามในการดำเนินการคำสั่งที่มีชื่อsudo /home/pi/shared/blink.sh 27 offซึ่งแน่นอนว่าไม่มีอยู่จริง

ลบเครื่องหมายคำพูดคู่ออกจากคำจำกัดความของtestvarคุณ

มันไม่สำคัญที่นี่ แต่อาจเป็นเรื่องจริงในกรณีของคุณ: แทนที่จะ${testvar}เขียน"$testvar"(หรือ"${testvar}"ถ้าคุณต้องการ แต่การจัดฟันเป็นตัวเลือก) ใส่เครื่องหมายคำพูดคู่ไว้รอบ ๆ การแทนที่ตัวแปรเสมอเว้นแต่คุณจะรู้ว่าทำไมคุณต้องปล่อยมันทิ้งไว้ "$testvar"ขยายไปยังค่าของตัวแปรtestvarในขณะที่$testvarเมื่อไม่อยู่ในเครื่องหมายคำพูดคู่ถือว่าเป็นค่าของtestvarรายการรูปแบบ glob แยกคั่นช่องว่าง


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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.