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

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

13
ฉันจะ grep สำหรับรูปแบบหลายรูปแบบโดยมีรูปแบบที่มีอักขระไพพ์ได้อย่างไร
ฉันต้องการค้นหาทุกบรรทัดในไฟล์หลายไฟล์ที่ตรงกับหนึ่งในสองรูปแบบ ฉันพยายามค้นหารูปแบบที่ฉันต้องการโดยพิมพ์ grep (foo|bar) *.txt แต่เชลล์ตีความ|ว่าbarเป็นไพพ์และบ่นเมื่อไม่มีการปฏิบัติการ ฉันจะ grep สำหรับหลายรูปแบบในไฟล์ชุดเดียวกันได้อย่างไร?

10
ฉันจะลบไฟล์ที่ชื่อขึ้นต้นด้วย“ -” (เครื่องหมายขีดกลางหรือขีดกลาง) ได้อย่างไร
คุณจะลบไฟล์ที่ชื่อไฟล์เริ่มต้นด้วยเครื่องหมายขีดกลาง (ขีดกลางหรือลบ) ได้-อย่างไร ฉันจะเข้าสู่เซิร์ฟเวอร์ OSX ระยะไกลและฉันมีไฟล์นี้ในไดเรกทอรีของฉัน: tohru:~ $ ls -l total 8 -rw-r--r-- 1 me staff 1352 Aug 18 14:33 --help ... ฉันจะลบ--helpจาก CLI ได้อย่างไรในโลก ปัญหานี้เป็นสิ่งที่ฉันเจอในรูปแบบที่แตกต่างกันในบางโอกาสไฟล์เหล่านี้ง่ายต่อการสร้าง แต่ยากที่จะกำจัด ฉันได้ลองใช้แบ็กสแลช rm \-\-help ฉันได้ลองเสนอราคา rm "--help" ฉันจะป้องกันไม่ให้อักขระลบ (ขีดกลางหรือเครื่องหมายขีดคั่น) เป็นตัวเลือกได้อย่างไร

5
ทำไมเชลล์สคริปต์ของฉันถึงสำลักในช่องว่างหรืออักขระพิเศษอื่น ๆ
หรือคู่มือแนะนำการจัดการชื่อไฟล์ที่มีประสิทธิภาพและการส่งผ่านสตริงอื่น ๆ ในเชลล์สคริปต์ ฉันเขียนเชลล์สคริปต์ซึ่งทำงานได้ดีเกือบตลอดเวลา แต่มันฉายาบางอินพุต (เช่นชื่อไฟล์บางชื่อ) ฉันพบปัญหาเช่นต่อไปนี้: ฉันมีชื่อไฟล์ที่มีพื้นที่hello worldและมันก็ถือว่าเป็นสองไฟล์แยกต่างหากและhelloworld ฉันมีสายอินพุตพร้อมช่องว่างสองช่องติดต่อกัน ช่องว่างนำหน้าและต่อท้ายหายไปจากบรรทัดอินพุต บางครั้งเมื่ออินพุตมีอักขระหนึ่งตัวอักขระ\[*?เหล่านั้นจะถูกแทนที่ด้วยข้อความบางส่วนซึ่งเป็นชื่อไฟล์จริง มีเครื่องหมายอะโพสโทรฟี'(หรือเครื่องหมายคำพูดคู่") ในอินพุตและสิ่งต่าง ๆ แปลกประหลาดหลังจากจุดนั้น มีแบ็กสแลชในอินพุต (หรือ: ฉันใช้ Cygwin และชื่อไฟล์บางส่วนของฉันมี\ตัวคั่นสไตล์ Windows ) เกิดอะไรขึ้นและฉันจะแก้ไขได้อย่างไร

3
ฉันต้องหลบตัวละครอะไรเมื่อใช้ sed ในสคริปต์ sh?
ใช้สคริปต์ต่อไปนี้: #!/bin/sh sed 's/(127\.0\.1\.1)\s/\1/' [some file] หากฉันพยายามเรียกใช้สิ่งนี้ในsh( dashที่นี่) มันจะล้มเหลวเนื่องจากวงเล็บซึ่งต้องหลีกหนี แต่ฉันไม่จำเป็นต้องหลบหลีกแบ็กสแลชตัวเอง (ระหว่างออคเต็ตหรือใน\sหรือ\1) กฎนี่คืออะไร สิ่งที่เกี่ยวกับเมื่อฉันจำเป็นต้องใช้{...}หรือ[...]? มีรายการสิ่งที่ฉันทำและไม่จำเป็นต้องหลบหนีหรือไม่?

3
ผลกระทบด้านความปลอดภัยของการลืมอ้างตัวแปรในเชลล์ bash / POSIX
หากคุณได้ติดตาม unix.stackexchange.com มาระยะหนึ่งแล้วคุณควรจะรู้ว่าตอนนี้การปล่อยตัวแปรที่ไม่ได้ระบุไว้ในบริบทรายการ (ดังในecho $var) ใน Bourne / POSIX shells (zsh เป็นข้อยกเว้น) มีความหมายพิเศษมากและ ไม่ควรทำจนกว่าคุณจะมีเหตุผลที่ดี มันกล่าวถึงในระยะในจำนวนของ Q & A นี่ (ตัวอย่าง: ทำไมไม่เชลล์สคริปต์สำลักของฉันในช่องว่างหรืออักขระพิเศษอื่น ๆ , เมื่อสองครั้ง quoting จำเป็น? , การขยายตัวของตัวแปรเปลือกและผลของ glob และแยกกับมัน , ที่ยกมา vs การขยายสตริงที่ไม่ได้กล่าวถึง) เป็นเช่นนี้มาตั้งแต่การเปิดตัว Bourne shell ในช่วงปลายยุค 70 และไม่ได้ถูกเปลี่ยนแปลงโดย Korn shell (หนึ่งในความเสียใจที่ยิ่งใหญ่ที่สุดของDavid Korn (คำถาม # 7) ) หรือbashที่คัดลอก Korn …

3
เหตุใด 'ls' จึงตัดรายการด้วยช่องว่างในเครื่องหมายคำพูดเดี่ยว
ฉันเพิ่งสังเกตเห็นว่าในหนึ่งในเครื่องของฉัน (เรียกใช้ Debian Sid) เมื่อใดก็ตามที่ฉันพิมพ์lsชื่อไฟล์ใด ๆ ที่มีช่องว่างมีคำพูดเดียวรอบมัน ฉันตรวจสอบชื่อแทนของฉันทันทีเพื่อค้นหาพวกเขาเหมือนเดิม wyatt@debian630:~/testdir$ ls 'test 1.txt' test1.txt wyatt@debian630:~/testdir$ alias alias ls='ls --color=auto' alias wget='wget --content-disposition' wyatt@debian630:~/testdir$ (ภาพ) การทดสอบอื่นด้วยไฟล์ที่มีเครื่องหมายคำพูดเดี่ยวในชื่อของพวกเขา (เช่นการตอบคำขอโดย jimmij): wyatt@debian630:~/testdir$ ls 'test 1.txt' test1.txt 'thishasasinglequotehere'\''.txt' wyatt@debian630:~/testdir$ touch "'test 1.txt'" wyatt@debian630:~/testdir$ ls ''\''test 1.txt'\''' test1.txt 'test 1.txt' 'thishasasinglequotehere'\''.txt' (ภาพ) อัพเดตด้วยเอาต์พุต coreutils-8.26 ใหม่ (ซึ่งเป็นที่ยอมรับน้อยกว่าความสับสน แต่ยังคงเกิดการระคายเคืองตามค่าเริ่มต้น) …

6
`(backquote / backtick) หมายถึงอะไรในคำสั่ง?
ฉันเจอคำสั่งต่อไปนี้: sudo chown `id -u` /somedir และฉันสงสัยว่า: ความหมายของ`สัญลักษณ์คืออะไร ฉันสังเกตเห็นว่าขณะที่คำสั่งข้างต้นทำงานได้ดีคำสั่งด้านล่างไม่ทำงาน: sudo chown 'id -u' /somedir
159 shell  quoting 

4
$ VAR เทียบกับ $ {VAR} และเพื่อพูดหรือไม่พูด
ฉันเขียนได้ VAR=$VAR1 VAR=${VAR1} VAR="$VAR1" VAR="${VAR1}" ผลลัพธ์ที่ได้สำหรับฉันทุกคนดูเหมือนจะเหมือนกัน ทำไมฉันต้องเขียนอย่างใดอย่างหนึ่ง? เหล่านี้ไม่ใช่พกพา / POSIX?

3
การอ้างอิงภายใน $ (การทดแทนคำสั่ง) ใน Bash
ในสภาพแวดล้อม Bash ของฉันฉันใช้ตัวแปรที่มีช่องว่างและฉันใช้ตัวแปรเหล่านี้ภายในการทดแทนคำสั่ง น่าเสียดายที่ฉันไม่พบคำตอบใน SE วิธีที่ถูกต้องในการอ้างอิงตัวแปรของฉันคืออะไร? และฉันควรทำอย่างไรถ้าสิ่งเหล่านี้ซ้อนอยู่? DIRNAME=$(dirname "$FILE") หรือฉันจะพูดนอกทดแทน? DIRNAME="$(dirname $FILE)" หรือทั้งคู่? DIRNAME="$(dirname "$FILE")" หรือฉันจะใช้เห็บกลับ? DIRNAME=`dirname "$FILE"` วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร? และฉันจะตรวจสอบได้อย่างง่ายดายว่าราคาถูกต้องหรือไม่

1
การอ้างอิงสองครั้งจำเป็นเมื่อใด
คำแนะนำเก่าที่ใช้ในการอ้างอิงสองครั้งนิพจน์ใด ๆ ที่เกี่ยวข้องกับ a $VARIABLE, อย่างน้อยถ้าใครอยากให้มันถูกตีความโดยเชลล์เป็นหนึ่งรายการเดียวมิฉะนั้นช่องว่างใด ๆ ในเนื้อหาของ$VARIABLEจะทิ้งเปลือก อย่างไรก็ตามฉันเข้าใจว่าใน shells รุ่นที่ใหม่กว่านั้นการอ้างสองครั้งไม่จำเป็นอีกต่อไป (อย่างน้อยก็เพื่อจุดประสงค์ที่อธิบายไว้ข้างต้น) ตัวอย่างเช่นในbash: % FOO='bar baz' % [ $FOO = 'bar baz' ] && echo OK bash: [: too many arguments % [[ $FOO = 'bar baz' ]] && echo OK OK % touch 'bar baz' % ls $FOO ls: …

6
ฉันจะเรียกใช้งาน 'date' ภายในงาน cron tab ได้อย่างไร?
ฉันต้องการสร้างไฟล์บันทึกสำหรับสคริปต์ cron ที่มีชั่วโมงปัจจุบันในชื่อไฟล์บันทึก นี่คือคำสั่งที่ฉันพยายามใช้: 0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log น่าเสียดายที่ฉันได้รับข้อความนี้เมื่อทำงาน: /bin/sh: -c: line 0: unexpected EOF while looking for matching ``' /bin/sh: -c: line 1: syntax error: unexpected end of file ฉันพยายามหนีdateส่วนต่างๆด้วยวิธีต่าง ๆ แต่ไม่มีโชคมาก เป็นไปได้ไหมที่จะทำให้สิ่งนี้เกิดขึ้นแบบอินไลน์ในไฟล์ crontab หรือฉันจำเป็นต้องสร้างเชลล์สคริปต์เพื่อทำสิ่งนี้?

7
ไม่สามารถใช้เครื่องหมายอัศเจรีย์ (!) ในการทุบตี?
ฉันพยายามใช้คำสั่ง curl เพื่อเข้าถึง http url ด้วยเครื่องหมายอัศเจรีย์ ( !) ในเส้นทาง เช่น: curl -v "http://example.org/!287s87asdjh2/somepath/someresource" bash: ... event not foundคอนโซลตอบกลับด้วย เกิดขึ้นที่นี่คืออะไร? และไวยากรณ์ที่เหมาะสมในการหลีกเลี่ยงเครื่องหมายอัศเจรีย์คืออะไร

4
ทำไมการขยายพารามิเตอร์ด้วยช่องว่างโดยไม่ใส่เครื่องหมายอัญประกาศทำงานในวงเล็บสอง“ [[” แต่ไม่อยู่ในเครื่องหมายวงเล็บ”“”
ฉันสับสนกับการใช้วงเล็บเดียวหรือสองครั้ง ดูรหัสนี้: dir="/home/mazimi/VirtualBox VMs" if [[ -d ${dir} ]]; then echo "yep" fi มันทำงานได้อย่างสมบูรณ์แม้ว่าสตริงจะมีช่องว่าง แต่เมื่อฉันเปลี่ยนเป็นวงเล็บเดี่ยว: dir="/home/mazimi/VirtualBox VMs" if [ -d ${dir} ]; then echo "yep" fi มันบอกว่า: ./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected เมื่อฉันเปลี่ยนเป็น: dir="/home/mazimi/VirtualBox VMs" if [ -d "${dir}" ]; then echo "yep" fi มันใช้งานได้ดี ใครสามารถอธิบายสิ่งที่เกิดขึ้น? เมื่อใดที่ฉันควรกำหนดเครื่องหมายคำพูดคู่ล้อมรอบตัวแปร"${var}"เพื่อป้องกันปัญหาที่เกิดจากช่องว่าง
85 bash  quoting  ksh  test 

7
ใช้ sed เพื่อค้นหาและแทนที่สตริงที่ซับซ้อน (ดีกว่าด้วย regex)
ฉันมีไฟล์ที่มีเนื้อหาดังต่อไปนี้: <username><![CDATA[name]]></username> <password><![CDATA[password]]></password> <dbname><![CDATA[name]]></dbname> และฉันต้องสร้างสคริปต์ที่เปลี่ยน "ชื่อ" ในบรรทัดแรกเป็น "บางอย่าง", "รหัสผ่าน" ในบรรทัดที่สองเป็น "someelse" และ "ชื่อ" ในบรรทัดที่สามเป็น "somethingdifferent" ฉันไม่สามารถพึ่งพาลำดับของสิ่งที่เกิดขึ้นเหล่านี้ในไฟล์ดังนั้นฉันจึงไม่สามารถแทนที่ "ชื่อ" ด้วย "บางอย่าง" เป็นครั้งแรกและเกิดขึ้นเป็นครั้งที่สองของ "ชื่อ" ด้วย "somethingdifferent" ฉันต้องค้นหาสตริงโดยรอบเพื่อให้แน่ใจว่าฉันค้นหาและแทนที่สิ่งที่ถูกต้อง จนถึงตอนนี้ฉันได้ลองคำสั่งนี้เพื่อค้นหาและแทนที่เหตุการณ์ "ชื่อ" แรก: sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml อย่างไรก็ตามมันไม่ทำงานดังนั้นฉันจึงคิดว่าตัวละครบางตัวอาจต้องหลบหนี ฯลฯ โดยหลักการแล้วฉันยินดีที่จะใช้ regex เพียงแค่จับคู่ "ชื่อผู้ใช้" สองครั้งและแทนที่ "ชื่อ" เท่านั้น บางอย่างเช่นนี้ แต่ด้วยsed: <username>.+?(name).+?</username> และแทนที่เนื้อหาในวงเล็บด้วย "บางอย่าง" เป็นไปได้ไหม

3
มันหมายความว่าอะไรที่จะมี $“ ดอลลาร์ - นำหน้าสตริง” ในสคริปต์?
ฉันเพิ่งเห็นสิ่งนี้ในสคริปต์ init: echo $"Stopping Apache" เครื่องหมายดอลลาร์คืออะไร การวิจัยของฉันจนถึงขณะนี้: ฉันพบสิ่งนี้ในคู่มือทุบตี: extquote หากตั้งค่า$'string'และการ$"string"อ้างอิงจะดำเนินการภายในส่วน${parameter}ขยายที่อยู่ในเครื่องหมายคำพูดคู่ ตัวเลือกนี้เปิดใช้งานโดยค่าเริ่มต้น ... แต่ฉันไม่พบความแตกต่างระหว่างสตริงที่มีและไม่มีส่วน$นำหน้า: $ echo "I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in ${PWD}" I am in /var/shared/home/southworth/qed $ echo "I am in ${PWD}" I …

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