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

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

1
การตัดคำสั่งที่มีเครื่องหมายคำพูดเดี่ยวและคู่สำหรับคำสั่งอื่น
ฉันเพิ่งเรียนรู้เกี่ยวกับนาฬิกาแต่ฉันมีปัญหาในการทำให้มันทำงานกับคำสั่งที่ค่อนข้างซับซ้อน ตัวอย่างเช่นฉันต้องการขอwatchให้เรียกใช้คำสั่งต่อไปนี้zshทุกสามวินาที* : for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done ดังที่คุณเห็นบรรทัดด้านบนมีเครื่องหมายคำพูดเดี่ยวเครื่องหมายคำพูดคู่และอักขระพิเศษอื่น ๆ ดังนั้นฉันจึงพยายาม: watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done" แต่แล้วฉันได้: ไม่พบข้อมูลที่ตรงกับ x in! @ # $ …
10 shell  zsh  quoting 

7
ฉันจะอ้างอิงการขยายตัวแปรภายในสตริงเพื่อหลีกเลี่ยงการแยกคำได้อย่างไร
$ myvar="/path to/my directory" $ sudo bash -c "cd $myvar" ในกรณีเช่นนี้ฉัน$myvarจะอ้างอิงเพื่อหลีกเลี่ยงการแยกคำเนื่องจากช่องว่างสีขาวในค่าของได้myvarอย่างไร
9 bash  shell  sudo  quoting 


4
เชลล์สคริปต์สามารถพิมพ์อาร์กิวเมนต์โดยอ้างอิงตามที่คุณต้องการเขียนลงในพร้อมท์เชลล์หรือไม่
ในเชลล์สคริปต์ความเข้าใจของฉันคือการ"$@"ขยายไปยังอาร์กิวเมนต์ของสคริปต์โดยอ้างอิงตามที่ต้องการ เช่นนี้ส่งต่อข้อโต้แย้งสคริปต์เพื่อ gcc: gcc -fPIC "$@" <<<แม้ว่าการใช้ไวยากรณ์ bash pass-to-stdin นั้น"@$"ไม่ได้ผลอย่างที่ฉันคาดไว้ #!/bin/bash cat <<< "$@" เรียกสคริปต์ตามที่./test.sh foo "bar baz"ให้ไว้ foo bar baz ฉันคาดหวัง foo "bar baz" มีวิธีเขียนเชลล์สคริปต์ที่พิมพ์อาร์กิวเมนต์เป็นคุณจะเขียนไว้ใน shell prompt หรือไม่ ตัวอย่างเช่น: คำใบ้เกี่ยวกับคำสั่งที่จะใช้ถัดไปรวมถึงอาร์กิวเมนต์ของสคริปต์ในคำใบ้

2
อะไรคือความแตกต่างระหว่าง $ 'string' ที่ยกมาเดี่ยวกับ $“ string” ที่เสนอในการทุบตี?
ฉันพยายามรันบรรทัดใหม่โดยใช้echoและลองทำตามสองคำสั่ง: คำสั่งแรก: echo $'Hello World\nThis is a new line' การตอบสนอง: Hello World This is a new line คำสั่งที่สอง: echo $"Hello World\nThis is a new line" การตอบสนอง: Hello World\nThis is a new line คำถามของฉันคือสิ่งที่แตกต่างระหว่างสตริงห่อด้วย$' 'VS สตริงห่อด้วย$" "ในbash's echo?
9 bash  quoting  echo 


1
`\ time ',` t \ ime` และ `\ cd` จริง ๆ ทำอะไร? (สนุกกับแบ็กสแลชในเปลือกหอย)
ขณะที่คุยมากกว่าความแตกต่างระหว่าง/usr/bin/timeและเปลือก (ทุบตีและ zsh) ในตัวtimeใครบางคนบอกว่าหนึ่งสามารถใช้เป็นชวเลขที่จะได้รับ\time/usr/bin/time ครั้งแรกดูเหมือนว่าจะเป็นทางลัดที่ไร้เดียงสา แต่คำถามก็เกิดขึ้น ทำไมถึงt\imeทำงานเช่นกัน? ทำไมถึง\cdเปลี่ยนได/usr/bin/cdเร็กตอรี่ถึงแม้ว่า¹จะไม่เป็นเช่นนั้น? ดังนั้นเห็นได้ชัดว่าจะไม่เทียบเท่ากับ\foo $(which foo)คำถามคือตอนนี้: พฤติกรรมที่สังเกตได้ของ\fooทั้งใน bash และ zsh ในทุก ๆ ด้านที่ครอบคลุมโดยนิยาม POSIX ของเชลล์และถ้าเป็นเช่นนั้นทำไมมันมีพฤติกรรมเหมือนมัน? เชิงอรรถ 1: /usr/bin/cdคือบนระบบของฉัน #!/bin/sh builtin cd "$@"

3
บรรทัดใหม่ในตัวแปรทุบตี
ฉันพยายามเก็บหลายบรรทัดในตัวแปร bash แต่ดูเหมือนจะไม่ทำงาน ตัวอย่างเช่นถ้าฉันแสดง/binหนึ่งไฟล์ต่อบรรทัดและเก็บไว้ใน$LSนั้นฉันผ่าน$LSเป็น stdin ไปที่wcมันจะส่งกลับ 1 เสมอ: $ ls -1 /bin | wc -l 134 $ LS=$(ls -1 /bin); wc -l <<< $LS 1 ถ้าฉันพยายามที่จะส่งออกไปยังหน้าจอฉันได้รับผลลัพธ์ต่าง ๆ : echoพิมพ์บรรทัดทั้งหมดในบรรทัดเดียวในขณะที่printfพิมพ์เฉพาะบรรทัดแรก: #!/bin/bash LS=$(ls -1 /bin) echo $LS printf $LS ดังนั้นตัวแปร bash สามารถมีได้หลายบรรทัด?
9 bash  shell  quoting 

2
ฉันจะผ่านการ subshell ผ่าน 'time' แบบมีเงื่อนไขได้อย่างไร
timeฉันมีสคริปต์การติดตั้งสำหรับกล่องจรจัดที่ผมใช้ในการวัดขั้นตอนเดียวกับ ตอนนี้ฉันต้องการเปิดหรือปิดใช้งานการวัดเวลาแบบมีเงื่อนไข ตัวอย่างเช่นก่อนหน้านี้บรรทัดจะมีลักษณะดังนี้: time (apt-get update > /tmp/last.log 2>&1) ตอนนี้ฉันคิดว่าฉันสามารถทำสิ่งนี้ได้ง่ายๆ: MEASURE_TIME=true [[ $MEASURE_TIME = true ]] && TIME="time --format=%e" || TIME="" $TIME (apt-get update > /tmp/last.log 2>&1) แต่สิ่งนี้จะไม่ทำงาน: syntax error near unexpected token `apt-get' `$TIME (apt-get update > /tmp/last.log 2>&1)' มีปัญหาอะไรที่นี่
9 bash  shell  quoting  time 


2
ฉันจะหลีกเลี่ยงชื่อไดเรกทอรีย่อยด้วยเครื่องหมายและในนั้นได้อย่างไร
ใช้ kornshell และพยายามสำรวจแผนผังไดเรกทอรี ต้องการ cd ไปยังไดเรกทอรีย่อยชื่อดังนี้ -3ab_&_-3dc.img คำถามของฉันคือฉันต้องหลบหนีจากเครื่องหมายและในชื่อนี้ได้อย่างไร ฉันลองชุดคำพูดและแบ็กสแลชที่แตกต่างกันโดยไม่ประสบความสำเร็จ

2
ทำไม --text =“ $ @” ผ่านคำแรกเท่านั้น
เมื่อฉันเรียกใช้สคริปต์ต่อไปนี้ด้วยข้อโต้แย้งบางอย่างเช่นarg1 arg2 arg3: #!/bin/bash zenity --entry --text="$@" Zenity สร้างกล่องโต้ตอบรายการด้วยข้อความนี้: "arg1" ในขณะที่ฉันคาดหวัง "arg1 arg2 arg3" ถ้าฉันใช้ตัวแปรเช่นสคริปต์ต่อไปนี้มันจะแสดงข้อโต้แย้งทั้งหมดสำหรับข้อความรายการ #!/bin/bash text="$@" zenity --entry --text="$text" ความแตกต่างระหว่างสคริปต์เหล่านี้คืออะไร? ทำไมคนแรกแทนที่$@ด้วยอาร์กิวเมนต์แรกเท่านั้น?
9 bash  shell  quoting 

1
การแก้ไขเครื่องหมายดอลลาร์ในเครื่องหมายคำพูดในทุบตี
ฉันใช้งานสคริปต์ทดสอบเล็ก ๆ นี้ที่ฉันเขียน: #!/bin/bash TESTCASE=$@ testHarness <<runTest $TESTCASE runTest จากบรรทัดคำสั่ง: ./test.sh "1092$212" แต่เครื่องหมายดอลลาร์กำลังถูกถอดออก ถ้าฉันหลบหนีมันใช้งานได้ แต่ฉันคิดว่าเครื่องหมายคำพูดคู่จะป้องกันฉันจากการต้องทำสิ่งนี้ ใครช่วยได้โปรดช่วยฉันเข้าใจว่าเกิดอะไรขึ้นและจะแก้ไขได้อย่างไร
9 bash  shell  quoting 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.