คำถามติดแท็ก bash-expansion

4
ยกเว้นตัวแปรสำหรับใช้เป็นเนื้อหาของสคริปต์อื่น
คำถามนี้ไม่เกี่ยวกับวิธีเขียนสตริงตัวอักษรที่ใช้ Escape อย่างเหมาะสม ฉันไม่พบคำถามที่เกี่ยวข้องซึ่งไม่เกี่ยวกับวิธีการหลีกเลี่ยงตัวแปรเพื่อการบริโภคโดยตรงภายในสคริปต์หรือโดยโปรแกรมอื่น ๆ เป้าหมายของฉันคือการเปิดใช้งานสคริปต์เพื่อสร้างสคริปต์อื่น ๆ เนื่องจากงานในสคริปต์ที่สร้างขึ้นจะทำงานที่ใดก็ได้ตั้งแต่ 0 ถึงnครั้งในเครื่องอื่นและข้อมูลที่สร้างขึ้นอาจเปลี่ยนแปลงก่อนที่จะทำงาน (อีกครั้ง) ดังนั้นการดำเนินการโดยตรงผ่านเครือข่ายจะ ไม่ทำงาน. รับทราบตัวแปรที่อาจมีตัวอักษรพิเศษเช่นคำพูดเดียวฉันต้องเขียนออกมาเป็นตัวอักษรสตริงหนีเต็มอย่างเช่นตัวแปรfooที่มีbar'bazควรจะปรากฏในสคริปต์ที่สร้างขึ้นเป็น: qux='bar'\''baz' ซึ่งจะเขียนโดยการต่อท้าย"qux=$foo_esc"บรรทัดอื่นของสคริปต์ ฉันใช้ Perl แบบนี้: foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'" แต่ดูเหมือนว่าเกินความจริง ฉันไม่ประสบความสำเร็จในการทำมันด้วยการทุบตีคนเดียว ฉันได้ลองหลายแบบแล้ว: foo_esc="'${file//\'/\'\\\'\'}'" foo_esc="'${file//\'/'\\''}'" แต่เครื่องหมายสแลชพิเศษอาจปรากฏในเอาต์พุต (เมื่อฉันทำecho "$foo") หรือพวกเขาทำให้เกิดข้อผิดพลาดทางไวยากรณ์ (ต้องการอินพุตเพิ่มเติมหากทำจากเชลล์)

3
วิธีการยกเว้นบางไฟล์จากกลไกการขยายชื่อไฟล์ในทุบตี?
ฉันมีไดเรกทอรีระบบไฟล์ Ubuntu ในไดเรกทอรีรากและฉันตั้งใจคัดลอกหลายร้อยไฟล์ลงในไดเรกทอรีราก ฉันพยายามลบไฟล์ที่คัดลอกโดยไม่รวมระบบไฟล์เช่น rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./. บุมันไม่ทำงาน วิธีที่เหมาะสมในการยกเว้นไดเรกทอรีบางรายการในขณะที่ลบทั้งรายการคืออะไร แก้ไข: อย่าลองคำสั่งใด ๆ ที่นี่โดยไม่รู้ว่าจะทำอย่างไร!

3
การขยายตัวแปรอัตโนมัติภายในคำสั่ง bash [[]]
เมื่อพิจารณาตัวแปรในbashคุณต้องใช้$เครื่องหมาย อย่างไรก็ตามดูเหมือนว่าสิ่งต่อไปนี้ใช้ได้ดี: x=5 [[ x -gt 2 ]] ใครสามารถอธิบายสิ่งนี้ได้บ้าง แก้ไข: (ข้อมูลเพิ่มเติม) สิ่งที่ฉันหมายถึงคืออะไรและทำไมคำสั่ง [[]] ถึงการยกเลิกตัวแปร x ของฉันโดยไม่มีเครื่องหมาย $ และใช่ถ้า x = 1 คำสั่งจะถูกประเมินเป็นเท็จ (สถานะส่งคืน 1)

1
bash Extended glob - จับคู่ไฟล์โดยไม่มีคำนำหน้า
ฉันพยายามจับคู่ชื่อไฟล์สำหรับคุก fail2ban ดังนั้นฉันจึงต้องใช้ชื่อไฟล์กลม ๆ เท่านั้น - ไม่ใช่ regexes หรือ bash scripting /var/log/apache2ไดเรกทอรีของฉันมีไฟล์รวมถึง: example.com.error.log db.example.com.error.log app1.example.com.error.log app2.example.com.error.log ฉันพยายามที่จะสร้าง glob เพื่อให้ตรงกับไฟล์ทั้งหมดที่ลงท้ายด้วย.error.log ยกเว้น db.example.error.log - นี้เป็นไปได้หรือไม่ ฉันได้พยายามแต่ยังคงตรงกับ!(db)*.error.log db.example.com.error.logฉันคาดเดาว่าการ!()จับคู่ไม่มีตัวละครทำให้การ*จับคู่จากจุดเริ่มต้นของชื่อไฟล์ หมายเหตุ: ฉันไม่ต้องการขยาย glob เมื่อเพิ่มappXไฟล์บันทึกใหม่ดังนั้นฉันไม่สามารถใช้@()กับรายการชื่อไฟล์ที่ไม่ใช่ db ที่รู้จักในปัจจุบัน (พื้นหลัง: ฉันต้องการสร้างตัวกรองห้ามใครก็ตามที่ขอ phpMyAdmin URL ใด ๆ ในโดเมนใด ๆยกเว้น db.example.com)

5
จะสร้างวลีพิเศษที่ขยายได้ใน bash ได้อย่างไร
ฉันพบว่าตัวเองทำ<command> --help | grep <feature>บ่อยมากทุกวัน ฉันสงสัยว่ามันเป็นไปได้ไหมที่จะทำสิ่ง^^ที่ขยายออกไป"--help | grep"จากนั้นฉันก็ทำสิ่งนี้: ls ^^ size ที่จะดำเนินการดังต่อไปนี้: ls --help | grep size

2
มีสูงสุดในการขยายชื่อไฟล์ทุบตี (globbing) และถ้าเป็นเช่นนั้นมันคืออะไร?
มีสูงสุดในการขยายชื่อไฟล์ทุบตี (globbing) และถ้าเป็นเช่นนั้นมันคืออะไร? ดูglobbingใน tldp.org สมมติว่าฉันต้องการเรียกใช้คำสั่งกับชุดย่อยของไฟล์: grep -e bar foo* rm -f bar* มีข้อ จำกัด ว่าจะขยายไฟล์ไปยังจำนวนเท่าใดและถ้าเป็นเช่นนั้นจะเป็นอย่างไร ฉันไม่ได้มองหาวิธีอื่นในการดำเนินการเหล่านั้น (เช่นโดยใช้find)

3
การขยายตัวเชลล์ (A | B) ในชื่อไฟล์?
เป็นไปได้หรือไม่ที่จะขยายorทางเลือกในเชลล์เมื่ออ่านไฟล์ตัวอย่าง สิ่งที่ฉันหมายถึงคือการgrepสนับสนุนไวยากรณ์ที่ต้องการ(A|B)จับคู่ A หรือ B ในไฟล์ ในทำนองเดียวกันถ้าฉันมีไฟล์เหล่านี้: file1.txt file2.txt file3.txt file4.txt file5.txt ฉันทำได้cat file{1..5}.txtในbashขณะที่มันขยายช่วง มีวิธีที่เท่าเทียมกันในการทำเช่นนี้เพียงไม่กี่ไฟล์? เช่นcat file(1|5).txtและพิมพ์ 2 เหล่านั้นเท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.