คำถามติดแท็ก quoting

โดยทั่วไปแล้วสตริงจะถูกคั่นด้วยเครื่องหมายคำพูดซึ่งทำให้เกิดปัญหาในการจัดการกับสตริงที่มีเครื่องหมายคำพูด

5
เราจะรันคำสั่งที่เก็บไว้ในตัวแปรได้อย่างไร?
$ ls -l /tmp/test/my\ dir/ total 0 ฉันสงสัยว่าทำไมวิธีต่อไปนี้ในการเรียกใช้คำสั่งด้านบนจึงล้มเหลวหรือสำเร็จ $ abc='ls -l "/tmp/test/my dir"' $ $abc ls: cannot access '"/tmp/test/my': No such file or directory ls: cannot access 'dir"': No such file or directory $ "$abc" bash: ls -l "/tmp/test/my dir": No such file or directory $ bash -c $abc 'my …
34 bash  shell  quoting  variable 

1
สัญลักษณ์แทนภายในคำพูด
นี่จะเป็นสิ่งที่ง่าย แต่ในความทรงจำของฉันเมื่อเชลล์สคริปต์การใช้เครื่องหมายคำพูดคู่จะช่วยให้การขยายแบบกลมและตัวแปร แต่ในรหัสต่อไปนี้: #!/bin/sh echo *.sh echo "*.sh" echo '*.sh' echo $LANG echo "$LANG" echo '$LANG' ฉันได้รับผลลัพธ์นี้: bob.sh redeployJboss.sh *.sh *.sh en_US.utf8 en_US.utf8 $LANG การโควตเดี่ยวจะป้องกันไม่ให้ glob และการขยายตัวแปรผัน แต่การโควตสองครั้งจะช่วยให้การขยายตัวแปรเท่านั้นและไม่มีการวนซ้ำ? ฉันสามารถโค้งในรูปแบบการอ้างอิงใด ๆ ?

2
grep และหนีเครื่องหมายดอลลาร์
$Id$ฉันต้องการที่จะทราบว่ามีไฟล์สตริง grep \$Id\$ my_dir/mylist_of_files ส่งกลับค่าที่เกิดขึ้น 0 ฉันค้นพบว่าฉันต้องใช้ grep \$Id$ my_dir/mylist_of_files จากนั้นฉันจะเห็นว่า$Idมีสีในเอาต์พุตนั่นคือมันถูกจับคู่ ฉันจะจับคู่ที่สองได้อย่างไร$และทำไมไม่\$Id\$ทำงาน ไม่สำคัญว่าตัวที่สอง$จะเป็นตัวละครตัวสุดท้ายหรือไม่ ฉันใช้grep2.9 ก่อนโพสต์คำถามของฉันฉันใช้ google ... ฉันพบคำตอบ หากต้องการค้นหา $ (เครื่องหมายดอลลาร์) ในไฟล์ชื่อ test2 ให้ป้อน: grep \\ $ test2 จำเป็นต้องใช้อักขระ \\ (double backslash) เพื่อบังคับให้เชลล์ส่ง a \ $ (เครื่องหมายแบ็กสแลชเดี่ยว, เครื่องหมายดอลลาร์) ไปยังคำสั่ง grep อักขระ \ (แบ็กสแลชเดี่ยว) บอกให้คำสั่ง grep ปฏิบัติต่ออักขระต่อไปนี้ (ในตัวอย่างนี้ $) เป็นตัวอักษรมากกว่าอักขระนิพจน์ ใช้คำสั่ง …

6
ตรวจสอบว่าหมายเลขอินพุตเป็นจำนวนเต็มหรือไม่
ฉันพยายามตรวจสอบว่าการป้อนข้อมูลเป็นจำนวนเต็มหรือไม่และฉันผ่านไปหลายร้อยครั้ง แต่ไม่เห็นข้อผิดพลาดในสิ่งนี้ อนิจจามันไม่ทำงานมันเป็นต้นเหตุของคำสั่ง if สำหรับอินพุตทั้งหมด (ตัวเลข / ตัวอักษร) read scale if ! [[ "$scale" =~ "^[0-9]+$" ]] then echo "Sorry integers only" fi ฉันเล่นด้วยคำพูด แต่ก็ไม่ได้ทำหรือไม่ทำอะไรเลย ฉันทำอะไรผิด มีวิธีที่ง่ายกว่าในการทดสอบว่าอินพุตเป็นเพียงจำนวนเต็มหรือไม่?

4
การอ้างถึง ssh $ host $ FOO และ ssh $ host“ sudo su user -c $ FOO”
ฉันมักจะจบลงด้วยการออกคำสั่งที่ซับซ้อนมากกว่า ssh; คำสั่งเหล่านี้เกี่ยวข้องกับ piping to awk หรือ perl one-line และด้วยเหตุนี้จึงมีการเสนอราคาเดียวและ $ 's ฉันไม่สามารถคิดออกกฎอย่างหนักและรวดเร็วในการอ้างอิงได้อย่างถูกต้องและไม่พบการอ้างอิงที่ดีสำหรับมัน ตัวอย่างเช่นพิจารณาสิ่งต่อไปนี้: # what I'd run locally: CMD='pgrep -fl java | grep -i datanode | awk '{print $1}' # this works with ssh $host "$CMD": CMD='pgrep -fl java | grep -i datanode | awk '"'"'{print $1}'"'" (สังเกตเครื่องหมายอัญประกาศพิเศษในคำสั่ง awk) …
30 bash  shell  ssh  quoting 

3
วิธี echo `single quote` เมื่อใช้ single quote เพื่อห่ออักขระพิเศษใน shell?
ฉันกำลังอ่านบทเรียนเกี่ยวกับเชลล์วันนี้จากhttp://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm ซึ่งกล่าวถึง: หากการเสนอราคาเดียวปรากฏขึ้นภายในสตริงที่จะส่งออกคุณไม่ควรใส่สตริงทั้งหมดภายในเครื่องหมายคำพูดเดียวแทนคุณจะต้องนำการ backslash () ดังต่อไปนี้: echo 'It\'s Shell Programming' ฉันลองสิ่งนี้บนเซิร์ฟเวอร์ centos ของฉันมันไม่ทำงานขอ>ให้ฉันพิมพ์อีกมาก ผมสงสัยว่าตั้งแต่สองราคาเดียวเปลี่ยนทุกตัวอักษรพิเศษเป็นตัวอักษรปกติซึ่งรวมถึงสัญลักษณ์หลบหนี\แต่ไม่รวมตัวเอง', วิธีการที่ฉันควรจะเป็นตัวแทนคำพูดเดียวเดียว'ในวลีเดียวที่ยกมา?
26 shell  quoting 

2
วิธีการรันคำสั่งแบบง่ายโดยพลการบน ssh โดยไม่ทราบว่าเชลล์ล็อกอินของผู้ใช้รีโมต
ssh มีคุณสมบัติที่น่ารำคาญเมื่อคุณเรียกใช้: ssh user@host cmd and "here's" "one arg" แทนที่จะเรียกใช้งานโดยที่cmdมีการขัดแย้งบนhostมันจะเชื่อมต่อcmdและขัดแย้งกับช่องว่างและรันเชลล์hostเพื่อตีความสตริงผลลัพธ์ (ฉันเดาว่านั่นเป็นสาเหตุที่เรียกว่าsshไม่ใช่sexec) ยิ่งกว่านั้นคุณไม่รู้ว่าเชลล์จะใช้อะไรในการตีความสตริงนั้นเพราะนั่นคือเชลล์ล็อกอินuserที่ไม่ได้รับประกันว่าจะเป็นบอร์นเหมือนที่มีคนใช้tcshเป็นเชลล์ล็อกอินfishอยู่และกำลังเพิ่มขึ้นเรื่อย ๆ มีวิธีแก้ไขไหม? สมมติว่าฉันมีคำสั่งเป็นรายการของอาร์กิวเมนต์เก็บไว้ในที่bashอาร์เรย์แต่ละที่อาจจะมีลำดับของไบต์ไม่ใช่ null ใด ๆ จะมีวิธีใดที่จะมีมันดำเนินการในhostขณะที่userในลักษณะที่สอดคล้องกันโดยไม่คำนึงถึงเปลือกเข้าสู่ระบบที่userเกี่ยวกับhost(ซึ่งเราจะถือว่าเป็นหนึ่งในตระกูลเชลล์ที่สำคัญของ Unix: Bourne, csh, rc / es, fish)? อีกข้อสันนิษฐานที่สมเหตุสมผลที่ฉันควรจะทำก็คือมีshคำสั่งhostให้ใช้งานได้ใน$PATHที่นั้นเข้ากันได้กับบอร์น ตัวอย่าง: cmd=( 'printf' '<%s>\n' 'arg with $and spaces' '' # empty $'even\n* * *\nnewlines' "and 'single quotes'" '!!' ) ฉันสามารถเรียกใช้ภายในเครื่องด้วยksh/ zsh/ bash/ yashเป็น: …

5
ทำไมฉันต้องอ้างตัวแปรสำหรับถ้า แต่ไม่ใช่เพื่อ echo
ฉันได้อ่านแล้วว่าคุณต้องการอัญประกาศคู่เพื่อขยายตัวแปรเช่น if [ -n "$test" ]; then echo '$test ok'; else echo '$test null'; fi จะทำงานตามที่คาดไว้ในขณะที่ if [ -n $test ]; then echo '$test ok'; else echo '$test null'; fi จะพูดเสมอ$test okแม้ว่า$testจะเป็นโมฆะ แต่ทำไมเราไม่ต้องการคำพูดecho $test?
26 shell  quoting 

4
ข้อผิดพลาดสคริปต์ทุบตีกับสตริงที่มีเส้นทางที่มีช่องว่างและสัญลักษณ์
ฉันมีปัญหาในการเข้าใจพื้นฐานของการเขียนสคริปต์ Bash นี่คือสิ่งที่ฉันมี: #!/bin/bash FILES="/home/john/my directory/*.txt" for f in "${FILES}" do echo "${f}" done สิ่งที่ฉันต้องการทำคือรายการ.txtไฟล์ทั้งหมดในforลูปเพื่อให้ฉันสามารถทำสิ่งกับพวกเขา แต่พื้นที่ในmy directoryและเครื่องหมายดอกจันใน*.txtเพียงไม่เล่นอย่าง ฉันลองใช้มันโดยไม่ใส่เครื่องหมายอัญประกาศคู่โดยมีและไม่มีเครื่องหมายปีกกาบนชื่อตัวแปรและยังไม่สามารถพิมพ์.txtไฟล์ทั้งหมดได้ นี่เป็นสิ่งพื้นฐานมาก แต่ฉันยังคงดิ้นรนเพราะฉันเหนื่อยและคิดไม่ออก ผมทำอะไรผิดหรือเปล่า? ฉันสามารถใช้สคริปต์ด้านบนได้สำเร็จหากไฟล์ของฉันไม่มีที่ว่างหรือเครื่องหมายดอกจัน ... ฉันต้องทำการทดสอบว่ามีหรือไม่มีการใช้เครื่องหมายคำพูดคู่และเครื่องหมายปีกกาเพื่อให้มันทำงานได้หรือไม่ แต่ช่วงเวลาที่ฉันมีทั้งช่องว่างและดอกจันมันทำให้ทุกอย่างยุ่ง

5
เหตุใด echo จึงเพิกเฉยอักขระคำพูดของฉัน
คำถามนี้ถูกโยกย้ายจาก Server Fault เนื่องจากสามารถตอบได้ใน Unix & Linux Stack Exchange อพยพ 8 ปีที่แล้ว echoคำสั่งไม่ได้รวมถึงข้อความที่สมบูรณ์แบบที่ฉันให้มัน ตัวอย่างเช่นถ้าฉัน: $ echo ' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` ' มันเอาท์พุท: echo PARAM=` grep $ARG /var/tmp/setfile | awk {print } ` เครื่องหมายคำพูดเดี่ยว ( ') ที่ฉันมีในคำสั่ง echo ไม่รวมอยู่ด้วย หากฉันเปลี่ยนเป็นเครื่องหมายคำพูดคู่: $ echo " echo …
24 shell  quoting  echo 

2
ลบไฟล์ทั้งหมดที่เริ่มต้นด้วยเครื่องหมายคำถาม
ฉันมีโฟลเดอร์ที่มีไฟล์ประมาณ 4k ไฟล์เหล่านี้บางไฟล์เริ่มต้นด้วย aa ?หรือ!ตัวอักษร ฉันต้องการลบ แต่ไม่สามารถหานิพจน์ที่จะทำ: rm -f ./?* เพียงลบทุกอย่าง ฉันสามารถใช้grepls และไปป์xargsและย้ายไฟล์ไปยังโฟลเดอร์อื่น แต่ฉันหวังว่าจะมีวิธีที่เหมาะสมในการทำเช่นนี้ ต้องการความช่วยเหลือทั้งใน?และ!ไฟล์

5
ทำไมต้องใช้เครื่องหมายคำพูดคู่ในการทดสอบ [[]]
สมมติว่าเรามีจำนวนเต็ม 2 ตัวในสคริปต์ทุบตี: value1=5 value2=3 แล้วทำไมเราต้องใช้เครื่องหมายคำพูดคู่ในกรณีของการทดสอบ? ตัวอย่างเช่น: if [[ "$value1" -eq "$value2" ]] ทำไมไม่ลองใช้สิ่งต่อไปนี้? if [[ $value1 -eq $value2 ]] สำหรับฉันการเสนอราคาสองครั้งไม่สมเหตุสมผลเลย
23 bash  shell  quoting  variable  test 

4
อะไรคือความแตกต่างระหว่าง echo `date ', echo“` date'” และ echo '' date ''?
ความแตกต่างระหว่างสามคำสั่งเหล่านี้คืออะไร? echo `date` echo "`date`" echo '`date`' ฉันสับสนในความแตกต่างจริง ๆ ฉันคิดว่าเมื่อ 'อยู่ใกล้ก็หมายความว่ามันเป็นสตริงดังนั้นเสียงก้องจะออกสตริงdateแทนที่จะแสดงวันที่?
23 shell  quoting  echo 

2
เหตุใดจึงต้องหลีกเลี่ยงอักขระตัวเล็กในเชลล์สคริปต์
ฉันเพิ่งเปิดเชลล์สคริปต์ดั้งเดิม (เขียนด้วย ksh88 เก่าบน Solaris) และพบสิ่งต่อไปนี้ซ้ำแล้วซ้ำอีกตลอดทั้งรหัส: [ -f $myfile ] && \rm -f $myfile แบ็กสแลชที่หนีออกมาจะทำให้ฉันประหลาด ฉันรู้ว่ามันเป็นการจงใจเนื่องจากการหลบหนี (ไร้ประโยชน์แบบนี้) ซ้ำแล้วซ้ำอีกตลอดทั้งรหัส ผู้เขียนดั้งเดิมหายไปนานฉันไม่สามารถติดต่อกับเขาเพื่อขอให้เขา นี่เป็นเพียงนิสัยแปลก ๆ ตลก ๆ ของผู้แต่งหรือเป็นแนวปฏิบัติที่ดีที่เลิกใช้แล้วซึ่งทำให้เข้าใจได้ในบางเวลา หรืออาจเป็นวิธีที่แนะนำในการทำสิ่งต่าง ๆ และฉันก็ขาดอะไรไปบ้าง?

5
ฉันจะลบไฟล์ชื่อ“>” ได้อย่างไร?
ผมทำงานสคริปต์หลามที่ผิดปกติและนำมาใช้ในการสร้างไฟล์ชื่อsudo> ฉันจะกำจัดไฟล์นี้ได้อย่างไร แน่นอนว่าเมื่อฉันพยายามที่sudo rm >ฉันได้รับข้อผิดพลาดเพราะคิดว่าฉันพยายามที่จะเปลี่ยนเส้นทางการส่งออกของbash: syntax error near unexpected token 'newline'rm -rw-r--r--มันเป็นสิทธิ์
22 bash  quoting  filenames  rm 

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