คำถามติดแท็ก shell-script

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

9
ทำไมจึงควรใช้“ #! / usr / bin / env NAME” แทนที่จะเป็น“ #! / path / to / NAME” เป็น shebang ของฉัน
ผมสังเกตเห็นว่าบางสคริปต์ที่ฉันได้รับจากคนอื่น ๆ มี shebang #!/path/to/NAMEขณะที่คนอื่น (โดยใช้เครื่องมือเดียวกัน NAME) มี #!/usr/bin/env NAMEshebang ทั้งคู่ดูเหมือนจะทำงานอย่างถูกต้อง ในบทช่วยสอน (บน Python) ดูเหมือนจะมีข้อเสนอแนะว่า Shebang หลังดีกว่า แต่ฉันไม่เข้าใจว่าทำไมจึงเป็นเช่นนี้ ฉันรู้ว่าเพื่อที่จะใช้ Shebang หลัง NAME จะต้องอยู่ในเส้นทางในขณะที่ Shebang แรกไม่มีข้อ จำกัด นี้ นอกจากนี้ยังปรากฏว่าสำหรับฉันคนแรกจะดีกว่า shebang เพราะมันระบุได้อย่างแม่นยำว่าที่ใดที่ NAME ตั้งอยู่ ดังนั้นในกรณีนี้หากมี NAME หลายเวอร์ชัน (เช่น / usr / bin / NAME, / usr / local / bin / NAME) …

3
การใช้“ $ {a: -b}” สำหรับการกำหนดตัวแปรในสคริปต์
ฉันดูสคริปต์บางตัวที่คนอื่นเขียน (โดยเฉพาะ Red Hat) และตัวแปรจำนวนมากถูกกำหนดโดยใช้สัญกรณ์ต่อไปนี้ VARIABLE1="${VARIABLE1:-some_val}" หรือบางตัวขยายตัวแปรอื่น ๆ VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}" จุดประสงค์ของการใช้สัญลักษณ์นี้แทนที่จะประกาศเพียงค่าโดยตรงVARIABLE1=some_valคืออะไร? มีประโยชน์กับสัญกรณ์นี้หรือข้อผิดพลาดที่เป็นไปได้ที่จะป้องกัน? ที่ไม่:-ได้มีความหมายเฉพาะในบริบทนี้?

14
ใน Bash เมื่อนามแฝงเมื่อสคริปต์และเมื่อใดที่จะเขียนฟังก์ชั่น?
ฉันใช้งาน Linux มาเกือบ 10 ปีแล้วเพื่อถามคำถามนี้ มันเป็นการทดลองและข้อผิดพลาดทั้งหมดและการท่องอินเทอร์เน็ตแบบดึกดื่น แต่ผู้คนไม่ควรต้องการ 10 ปีสำหรับเรื่องนี้ ถ้าฉันเพิ่งเริ่มต้นด้วย Linux ฉันต้องการทราบว่าเมื่อใดจะใช้นามแฝงเวลาเขียนสคริปต์และเมื่อใดควรเขียนฟังก์ชัน ฉันใช้นามแฝงสำหรับการดำเนินการที่ง่ายมากที่ไม่มีข้อโต้แย้ง alias houston='cd /home/username/.scripts/' ดูเหมือนว่าชัดเจน แต่บางคนทำสิ่งนี้: alias command="bash bashscriptname" (และเพิ่มลงใน.bashrcไฟล์) มีเหตุผลที่ดีที่จะทำเช่นนั้น? ฉันพยายามอย่างหนักจริง ๆ แต่ฉันไม่สามารถนึกถึงสถานการณ์ใด ๆ ที่ฉันต้องการจะทำอย่างแท้จริง ดังนั้นหากมีกรณีขอบที่จะสร้างความแตกต่างโปรดตอบด้านล่าง เพราะนั่นคือสิ่งที่ฉันจะใส่บางสิ่งใน PATH ของฉันchmod +xซึ่งเป็นอีกสิ่งหนึ่งที่เกิดขึ้นหลังจากการทดลองและข้อผิดพลาดของ Linux มาหลายปี ซึ่งนำฉันไปยังหัวข้อถัดไป ตัวอย่างเช่นฉันเพิ่มโฟลเดอร์ที่ซ่อนอยู่ ( .scripts/) ในโฮมไดเร็กตอรี่ไปที่ PATH ของฉันโดยเพิ่มบรรทัดลงใน.bashrc( PATH=$PATH:/home/username/.scripts/) ของฉันดังนั้นสิ่งใดที่ปฏิบัติการได้ในการเติมข้อความอัตโนมัติโดยอัตโนมัติ ถ้าฉันต้องการ ฉันไม่ต้องการสิ่งนั้นจริง ๆ ใช่ไหม? ฉันจะใช้เฉพาะสำหรับภาษาที่ไม่ใช่เปลือกเช่น Python …

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

23
ฉันจะรับที่อยู่ IP ภายนอกในเชลล์สคริปต์ได้อย่างไร
ฉันต้องการค้นหาที่อยู่ IP ภายนอกของฉันจากเชลล์สคริปต์ ในขณะนี้ฉันใช้ฟังก์ชั่นนี้: myip () { lwp-request -o text checkip.dyndns.org | awk '{ print $NF }' } แต่มันขึ้นอยู่กับperl-libwww, perl-html-format, perl-html-treeติดตั้ง ฉันจะรับ IP ภายนอกของฉันได้อีกวิธีใด
273 linux  shell-script  ip 

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

9
ฉันจะส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยังเชลล์สคริปต์ได้อย่างไร
ฉันรู้ว่าเชลล์สคริปต์เพียงแค่เรียกใช้คำสั่งราวกับว่าพวกเขาถูกดำเนินการในที่พรอมต์คำสั่ง ฉันต้องการที่จะสามารถเรียกใช้เชลล์สคริปต์ราวกับว่าพวกเขาเป็นฟังก์ชั่น ... นั่นคือการใส่ค่าหรือสตริงลงในสคริปต์ ฉันจะทำสิ่งนี้ได้อย่างไร

8
ฉันจะทดสอบได้อย่างไรว่าตัวแปรว่างเปล่าหรือมีช่องว่างเท่านั้น?
ไวยากรณ์ bash ต่อไปนี้ตรวจสอบว่าparamไม่ว่างเปล่า: [[ ! -z $param ]] ตัวอย่างเช่น: param="" [[ ! -z $param ]] && echo "I am not zero" ไม่มีการส่งออกและปรับ แต่เมื่อparamว่างเปล่ายกเว้นอักขระเว้นวรรคหนึ่งตัว (ขึ้นไป) เคสจะแตกต่างกัน: param=" " # one space [[ ! -z $param ]] && echo "I am not zero" เอาท์พุท "ฉันไม่ได้เป็นศูนย์" ฉันจะเปลี่ยนการทดสอบเพื่อพิจารณาตัวแปรที่มีอักขระเว้นวรรคว่างเปล่าได้อย่างไร

3
ทำให้เนื้อหาของไฟล์ว่างเปล่า
ฉันตระหนักถึงสามวิธีในการลบรายการทั้งหมดจากไฟล์ พวกเขาคือ >filename touch filename filename < /dev/null ในสามคนนี้ฉันใช้ความรุนแรง>filenameมากที่สุดเนื่องจากต้องใช้การกดแป้นน้อยที่สุด อย่างไรก็ตามฉันต้องการทราบว่าวิธีใดที่มีประสิทธิภาพมากที่สุดในสาม (หากมีวิธีที่มีประสิทธิภาพมากกว่านี้) สำหรับไฟล์บันทึกขนาดใหญ่และไฟล์ขนาดเล็ก นอกจากนี้สามรหัสทำงานและลบเนื้อหาอย่างไร

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 …

13
ลบอักขระตัวสุดท้ายของสตริงโดยใช้การจัดการสตริงในเชลล์สคริปต์
ฉันต้องการลบอักขระตัวสุดท้ายของสตริงฉันลองใช้สคริปต์ตัวน้อยนี้: #! /bin/sh t="lkj" t=${t:-2} echo $t แต่มันพิมพ์ "lkj" สิ่งที่ฉันทำผิด?

12
ฉันจะเปลี่ยนนามสกุลของหลายไฟล์ได้อย่างไร
ผมอยากจะเปลี่ยนนามสกุลไฟล์จากไป*.txt *.textฉันพยายามใช้basenameคำสั่ง แต่ฉันมีปัญหาในการเปลี่ยนมากกว่าหนึ่งไฟล์ นี่คือรหัสของฉัน: files=`ls -1 *.txt` for x in $files do mv $x "`basename $files .txt`.text" done ฉันได้รับข้อผิดพลาดนี้: basename: too many arguments Try basename --help' for more information


6
สร้างไฟล์ชั่วคราวในเชลล์สคริปต์ได้อย่างไร
ในขณะที่เรียกใช้สคริปต์ฉันต้องการสร้างไฟล์ชั่วคราวใน/tmpไดเรกทอรี หลังจากเรียกใช้งานสคริปต์นั้นสคริปต์นั้นจะถูกกำจัด วิธีทำในเชลล์สคริปต์?
155 shell-script  tmp 

10
ฉันจะตัดช่องว่างนำหน้าและต่อท้ายจากแต่ละบรรทัดของเอาต์พุตบางรายการได้อย่างไร
ฉันต้องการลบช่องว่างและแท็บนำหน้าและส่วนท้ายทั้งหมดออกจากแต่ละบรรทัดในเอาต์พุต มีเครื่องมือง่ายๆอย่างที่trimฉันสามารถเอาท์พุทของฉันเป็น? ไฟล์ตัวอย่าง: test space at back test space at front TAB at end TAB at front sequence of some space in the middle some empty lines with differing TABS and spaces: test space at both ends

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