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

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

2
เพิ่มอาร์กิวเมนต์ให้กับ 'bash -c'
สมมติว่าฉันต้องการเรียกใช้คำสั่งผ่าน Bash ดังนี้: /bin/bash -c "ls -l" ตามหน้า Bash man ฉันก็สามารถเรียกใช้เช่นนี้: # don't process arguments after this one # | pass all unprocessed arguments to command # | | # V V /bin/bash -c ls -- -l ยกเว้นดูเหมือนว่าจะไม่ทำงาน (ดูเหมือนจะถูกละเว้น) ฉันกำลังทำอะไรผิดหรือฉันตีความหน้าคนผิดหรือเปล่า? คำพูดที่เกี่ยวข้องจากมนุษย์: หากมีอ็อพชัน -c อยู่คำสั่งจะอ่านจากสตริง หากมีข้อโต้แย้งหลังจากสตริงพวกเขาจะถูกกำหนดให้กับพารามิเตอร์ตำแหน่งเริ่มต้นด้วย $ 0 และ เอ - …

1
เหตุใด 'ไม่พบ' แสดงไฟล์นี้
ใช้findกับgrepหนึ่งสามารถค้นหาไฟล์ที่ตรงกับรูปแบบ: # find | grep error ./solr-modifiedSolr4/SolrPhpClient/phpdocs/errors.html ./error_log ./includes/classes/error_log อย่างไรก็ตามการใช้findเพียงไฟล์เดียวไม่พบ: # find . -name error* ./error_log ./includes/classes/error_log ทำไมไม่findค้นหาerrors.htmlไฟล์เมื่อไม่ได้ใช้กับgrep? วิธีfindใช้ในการแสดงไฟล์นี้เช่นกัน?

1
วิธีการตรวจสอบให้แน่ใจว่าสตริงที่ถูกสอดแทรกเข้าไปใน `การแทนที่ 'sed` จะหนี metachars ทั้งหมด
ฉันมีสคริปต์ที่อ่านข้อความกระแสและสร้างไฟล์คำสั่ง sed sed -fว่าจะดำเนินการต่อมาเป็น คำสั่ง sed ที่สร้างขึ้นมีลักษณะดังนี้: s/cid:image002\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1922/g s/cid:image003\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1923/g s/cid:image004\.jpg@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1924/g สมมติว่าสคริปต์ที่สร้างsedคำสั่งมีลักษณะดังนี้: while read cid fileid do cidpat="$(echo $cid | sed -e s/\\./\\\\./g)" echo 's/'"$cidpat"'/https:\/\/mysite.com\/files\/'"$fileid"'/g' >> sedscr done ฉันจะปรับปรุงสคริปต์เพื่อให้มั่นใจว่าอักขระเมตาของ regex ทั้งหมดในcidสตริงได้รับการยกเว้นและแก้ไขอย่างถูกต้องหรือไม่
21 sed  quoting 

2
คำพูดซ้อนคู่ในหนึ่งคะแนนโหวตสูง
คำตอบ StackOverflow ด้วย> 3.5K โหวตให้คุณสมบัติหนึ่งซับสำหรับการกำหนดไปDIRยังไดเรกทอรีของสคริปต์ทุบตีปัจจุบัน: DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ฉันงงกับคำพูดซ้อนคู่ เท่าที่ฉันสามารถบอกได้ชิ้นส่วนต่อไปนี้เป็นเครื่องหมายคำพูดคู่: "$( cd " "${BASH_SOURCE[0]}" " && pwd )" ... และทุกอย่างอื่นทางด้านขวาของ=(เช่น$( dirnameและ)) ไม่มีการอ้างอิง ในคำอื่น ๆ ฉันคิดว่าตัวละครที่ 2, 4 และ 6 ""ปิด" ตัวที่ 1, 3 และ 5 "ตามลำดับ ฉันเข้าใจว่าการเสนอราคาสองเท่าในการ"${BASH_SOURCE[0]}"บรรลุผลสำเร็จ แต่อะไรคือจุดประสงค์ของการเสนอราคาสองคู่อื่น ๆ หากในอีกทางหนึ่ง (และคะแนนโหวตสูงถึงแม้จะมี) ตัวอย่างข้างต้นไม่ถูกต้องสิ่งที่เป็นวิธีที่เหมาะสมเพื่อให้บรรลุเจตนาที่ระบุ? (โดยเจตนาที่ระบุฉันหมายถึง: รวบรวมค่าที่ส่งคืนโดยpwdหลังจากการcdเข้าสู่ไดเรกทอรีที่ส่งคืนโดยครั้งแรกdirname …

1
ใช้ sed กับเครื่องหมาย & (&)
ฉันใช้ sed เพื่อค้นหาและแทนที่รูปแบบภายในไฟล์ SAS ที่ฉันมีแทนที่จะเปลี่ยนทีละรายการ ปัญหาคือฉันพยายามแทนที่ตัวแปรมาโครและเมื่อฉันใช้เครื่องหมายและมันไม่ได้ประมวลผลอย่างถูกต้อง Here's my code: sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas เมื่อใดก็ตามที่ฉันเรียกใช้คำสั่งนี้ดูเหมือนว่าจะผนวกและทำสิ่งที่ขี้ขลาดทุกชนิดด้วยข้อความต้นฉบับ คำถาม: ฉันจะแทนที่ข้อความที่มีเครื่องหมายภายในด้วยคำสั่ง sed ได้อย่างไร
19 sed  quoting  replace 

4
วิธีกำหนดค่าที่มีช่องว่างให้กับตัวแปรใน bash โดยใช้ eval
evalฉันต้องการที่จะแบบไดนามิกค่ากำหนดตัวแปรโดยใช้ ตัวอย่างตัวอย่างต่อไปนี้ใช้งานได้: var_name="fruit" var_value="orange" eval $(echo $var_name=$var_value) echo $fruit orange อย่างไรก็ตามเมื่อค่าตัวแปรมีช่องว่างevalส่งคืนข้อผิดพลาดแม้ว่า$var_valueจะอยู่ระหว่างเครื่องหมายคำพูดคู่: var_name="fruit" var_value="blue orange" eval $(echo $var_name="$var_value") bash: orange : command not found วิธีใดที่จะหลีกเลี่ยงสิ่งนี้
19 bash  shell  quoting 

2
ความหมายของคำพูดเดี่ยวและคู่ในตัวแปรสภาพแวดล้อมคืออะไร?
ฉันกำหนดตัวแปรสภาพแวดล้อมบางอย่างใน. profile ของฉันเช่นนี้: MY_HOME="/home/my_user" แต่ดูเหมือนว่าตัวแปรจะไม่ประเมินเว้นแต่ว่าฉันจะตัดเครื่องหมายคำพูดออกแล้วทำการซอร์สไฟล์อีกครั้ง ฉันเชื่อว่าจำเป็นต้องมีเครื่องหมายอัญประกาศหากจะมีช่องว่างและใช้เครื่องหมายอัญประกาศเดี่ยวหากไม่ต้องการ Escape บางคนสามารถอธิบายความสำคัญของคำพูดเดี่ยวและคู่ในคำจำกัดความของตัวแปรได้หรือไม่? เห็บหน้าและเห็บหลังเหรอ?

3
เหตุใดตัวเลือกในตัวแปรที่ยกมาจึงล้มเหลว แต่ทำงานเมื่อไม่ได้อ้างอิง
ฉันอ่านเกี่ยวกับว่าฉันควรอ้างอิงตัวแปรใน bash เช่น "$ foo" แทนที่จะเป็น $ foo อย่างไรก็ตามในขณะที่เขียนสคริปต์ฉันพบกรณีที่ใช้ได้โดยไม่ต้องใส่เครื่องหมายคำพูด แต่ไม่ใช่กับพวกเขา: wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line อันนี้ใช้ได้ผล: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" อันนี้ไม่ (บันทึกคำพูดคู่ aroung $ wget_options): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" อะไรคือสาเหตุของสิ่งนี้? บรรทัดแรกเป็นเวอร์ชั่นที่ดี; หรือฉันควรสงสัยว่ามีข้อผิดพลาดที่ซ่อนอยู่ที่ไหนสักแห่งที่ทำให้เกิดพฤติกรรมนี้? …

6
ควรอ้างอิงตัวแปรเมื่อดำเนินการหรือไม่
กฎทั่วไปในการเขียนสคริปต์เปลือกคือตัวแปรที่ควรจะยกมาเว้นแต่จะมีเหตุผลที่น่าสนใจที่จะไม่ สำหรับรายละเอียดมากกว่าที่คุณอาจต้องการทราบลองดูที่ Q&A ที่ยอดเยี่ยมนี้: ผลกระทบด้านความปลอดภัยของการลืมอ้างตัวแปรใน bash / POSIX shellsเปลือกหอย พิจารณาอย่างไรก็ตามฟังก์ชั่นเช่นนี้: run_this(){ $@ } ควร$@จะยกมามีหรือไม่? ฉันเล่นกับมันสักครู่และไม่พบกรณีใด ๆ ที่การขาดคำพูดทำให้เกิดปัญหา ในทางกลับกันการใช้เครื่องหมายคำพูดทำให้หยุดพักเมื่อส่งคำสั่งที่มีช่องว่างเป็นตัวแปรที่ยกมา: #!/usr/bin/sh set -x run_this(){ $@ } run_that(){ "$@" } comm="ls -l" run_this "$comm" run_that "$comm" การเรียกใช้สคริปต์ด้านบนส่งคืน: $ a.sh + comm='ls -l' + run_this 'ls -l' + ls -l total 8 -rw-r--r-- 1 …

2
การขยายตัวของตัวแปรหอยและผลกระทบของ glob และแยกกับมัน
จริงๆแล้วโพสต์นี้มีคำถามสองข้อแยกกัน แต่ฉันคิดว่าการรวมกลุ่มพวกเขาเข้าด้วยกันจะให้บริบทเพิ่มเติม ฉันผ่านคำถามนี้ไปแล้วเกี่ยวกับเครื่องหมายคำพูดเกี่ยวกับตัวแปรแต่ฉันไม่เข้าใจว่าการขยายตัวของตัวแปรหมายถึงอะไรในตอนแรก ดังนั้นคำถามแรกของฉันคือ: อะไรคือการขยายตัวของตัวแปรใน Unix / Linux พูด? ส่วนที่สองของคำถามของฉันเกี่ยวข้องกับข้อกำหนดต่อไปนี้: glob แยก ค่าข้างต้นหมายถึงอะไรและมีผลต่อการขยายตัวของตัวแปรอย่างไร คำตอบสำหรับคำถามเดิมกล่าวถึงต่อไปนี้: คิดว่าไม่มีเครื่องหมายคำพูด (ในบริบทรายการ) เป็นตัวดำเนินการแยก + glob ราวกับว่า echo $ test เป็น echo glob (แยก ("$ test")) ฉันไม่สามารถหาคำตอบใด ๆ ที่อยู่ตรงแนวคิดของglobbingและแยกแต่ใช้คำเหล่านั้นได้โดยตรงในการตอบคำถามอื่น ๆ เช่นนี้หนึ่งเมื่อเร็ว ๆ นี้

2
คำพูดเดี่ยวในเครื่องหมายคำพูดคู่และคู่มืออ้างอิง Bash
ในส่วน 3.1.2.3 ชื่อ Double Quotes คู่มือ Bash พูดว่า: การใส่อักขระในเครื่องหมายคำพูดคู่ ('"') จะเก็บรักษาค่าตัวอักษรของอักขระทั้งหมดภายในเครื่องหมายคำพูดยกเว้น '$', '`', '\' และเมื่อเปิดใช้งานการขยายประวัติ '!' ในขณะนี้ฉันกังวลกับคำพูดเดียว ( ') เป็นความหมายพิเศษที่อธิบายไว้ในส่วนก่อนหน้าหัวข้อ 3.1.2.2 คือ: การใส่อักขระในเครื่องหมายคำพูดเดี่ยว ( ') จะรักษาค่าตามตัวอักษรของอักขระแต่ละตัวภายในเครื่องหมายคำพูด เครื่องหมายคำพูดเดี่ยวอาจไม่เกิดขึ้นระหว่างเครื่องหมายคำพูดเดี่ยวแม้ว่าจะนำหน้าด้วยเครื่องหมายทับขวา รวมสอง expositions echo "'$a'" โดยที่ตัวแปรaไม่ได้ถูกกำหนด (ดังนั้น$a= สตริงว่าง) ควรพิมพ์$aบนหน้าจอเนื่องจาก''การมีความหมายพิเศษภายในจะป้องกัน$จากการตีความพิเศษ แต่จะพิมพ์''ออกมา ทำไมเป็นเช่นนั้น
18 bash  shell  quoting 

1
ทำไมคำสั่ง ffmpeg นี้ทำงานใน bash ไม่ใช่ zsh?
วันนี้ฉันกลับถึงบ้านจากที่ทำงาน (เรียกใช้ทุบตีบนกล่อง Ubuntu) และพยายามที่จะเรียกใช้โค้ดบางอย่างบนกล่องซุ้มประตูท้องถิ่นของฉันด้วย zsh ที่รักของฉันและคำสั่งล้มเหลว? คำสั่งด้านล่างพร้อมข้อมูลส่วนบุคคลและ ip มีการเปลี่ยนแปลงอย่างชัดเจน ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4 มันทำงานได้อย่างสมบูรณ์แบบในการทุบตี แต่เมื่อฉันรันใน zsh ฉันได้รับข้อผิดพลาด zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 ทำไม zsh ที่รักของฉันทรยศฉัน
17 bash  zsh  quoting  url 

5
การใช้รายการชื่อไฟล์ที่สร้างขึ้นเป็นรายการอาร์กิวเมนต์ - พร้อมช่องว่าง
findฉันพยายามที่จะเรียกใช้สคริปต์กับรายการของชื่อไฟล์ที่เก็บรวบรวมโดย ไม่มีอะไรพิเศษเพียง someting เช่นนี้: $ myscript `find . -name something.txt` ปัญหาคือชื่อพา ธ บางส่วนมีช่องว่างดังนั้นพวกเขาจึงแยกออกเป็นชื่อที่ไม่ถูกต้องสองชื่อในการขยายอาร์กิวเมนต์ ปกติฉันจะล้อมรอบชื่อด้วยเครื่องหมายคำพูด แต่ที่นี่พวกเขาแทรกโดยการขยาย backquote ฉันพยายามกรองเอาท์พุทของfindและรอบ ๆ ชื่อไฟล์แต่ละรายการด้วยเครื่องหมายคำพูด แต่เมื่อถึงเวลาที่เห็นพวกเขามันสายเกินไปที่จะดึงออกมาและพวกเขาจะถือว่าเป็นส่วนหนึ่งของชื่อไฟล์: $ myscript `find . -name something.txt | sed 's/.*/"&"/'` No such file or directory: '"./somedir/something.txt"' ใช่นั่นเป็นกฎสำหรับวิธีการประมวลผลบรรทัดคำสั่ง แต่ฉันจะแก้ไขได้อย่างไร นี่เป็นเรื่องที่น่าอาย แต่ฉันไม่สามารถหาวิธีที่เหมาะสมได้ ในที่สุดฉันก็รู้ว่าจะทำอย่างไรกับxargs -0 -n 10000... แต่มันเป็นแฮ็คที่น่าเกลียดที่ฉันยังต้องการถาม: ฉันจะอ้างถึงผลลัพธ์ของการขยาย backquote หรือบรรลุผลแบบเดียวกันได้อย่างไร? แก้ไข:ฉันสับสนเกี่ยวกับความจริงที่ว่าxargs ไม่เก็บขัดแย้งทั้งหมดเป็นรายการอาร์กิวเมนต์เดียวเว้นแต่จะบอกเป็นอย่างอื่นหรือข้อ จำกัด …

2
เครื่องหมายคำพูดคู่ในทุบตีจับคู่กันอย่างไร
GNU bash 4.3.48ฉันใช้ พิจารณาสองคำสั่งต่อไปนี้ที่แตกต่างกันโดยเครื่องหมายดอลลาร์เดียวเท่านั้น คำสั่ง 1: echo "(echo " * ")" คำสั่ง 2: echo "$(echo " * ")" ผลลัพธ์ของพวกเขาคือตามลำดับ (echo test.txt ppcg.sh ) และ * เห็นได้ชัดในกรณีแรก*คือก้อนกลมซึ่งหมายความว่าเครื่องหมายอัญประกาศแรกไปพร้อมกับที่สองในการสร้างคู่และที่สามและสี่ในรูปแบบคู่อื่น ในกรณีที่สอง*ไม่ได้ถูกทำให้กลมและมีช่องว่างพิเศษสองช่องในช่องสัญญาณออกหนึ่งช่องก่อนหน้าเครื่องหมายดอกจันและช่องว่างด้านหลังหมายความว่าเครื่องหมายคำพูดที่สองจะขึ้นกับช่องที่สามและช่องแรกจะไปกับช่องที่สี่ มีกรณีอื่นนอกเหนือจากการ$()ก่อสร้างที่มีเครื่องหมายอัญประกาศไม่ตรงกับอันถัดไป แต่ซ้อนกันแทน? พฤติกรรมนี้ได้รับการบันทึกไว้อย่างดีหรือไม่และถ้าใช่ฉันจะหาเอกสารที่เกี่ยวข้องได้จากที่ใด

7
เหตุใดจึงมีความแตกต่างในเวลาดำเนินการของเสียงก้องและแมว?
การตอบคำถามนี้ทำให้ฉันถามคำถามอื่น: ฉันคิดว่าสคริปต์ต่อไปนี้ทำสิ่งเดียวกันและอันที่สองควรเร็วกว่ามากเพราะการใช้ครั้งแรกcatที่ต้องการเปิดไฟล์ซ้ำไปซ้ำมา แต่อย่างที่สองเปิดไฟล์เท่านั้น เพียงครั้งเดียวและเพียงแค่ก้องตัวแปร: (ดูหัวข้อการปรับปรุงสำหรับรหัสที่ถูกต้อง) ครั้งแรก: #!/bin/sh for j in seq 10; do cat input done >> output ประการที่สอง: #!/bin/sh i=`cat input` for j in seq 10; do echo $i done >> output ในขณะที่อินพุตประมาณ 50 เมกะไบต์ แต่เมื่อฉันลองครั้งที่สองมันก็ช้าเกินไปเพราะการสะท้อนตัวแปรiเป็นกระบวนการที่ยิ่งใหญ่ ฉันยังมีปัญหากับสคริปต์ที่สองเช่นขนาดของไฟล์ที่ส่งออกต่ำกว่าที่คาดไว้ ฉันยังตรวจสอบหน้า man ของechoและcatเปรียบเทียบ: echo - แสดงบรรทัดข้อความ cat - เชื่อมไฟล์และพิมพ์บนเอาต์พุตมาตรฐาน แต่ฉันไม่ได้รับความแตกต่าง ดังนั้น: ทำไมแมวถึงเร็วขนาดนี้และเสียงก้องช้าในบทที่สอง? …

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