การขยาย Bash Shell
หนึ่งในการทำงานของเชลล์เมื่อวิเคราะห์อินพุตคือการขยายเชลล์ Bash ให้การขยายประเภทต่างๆ ในบทความนี้ เราจะมาทบทวนส่วนเสริมที่สำคัญ — “ส่วนเสริมรั้ง”
บทความนี้เป็นส่วนหนึ่งของชุดการสอน Bash ที่กำลังดำเนินอยู่
ตัวต่อเสริม
การขยายวงเล็บปีกกาใช้เพื่อสร้างสตริงโดยพลการ การขยายวงเล็บปีกกาช่วยให้คุณสร้างอาร์กิวเมนต์บรรทัดคำสั่งที่แก้ไขได้หลายอาร์กิวเมนต์จากอาร์กิวเมนต์เดียว สตริงที่ระบุจะใช้เพื่อสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดด้วยคำนำและคำลงท้ายที่เป็นตัวเลือก คำนำนำหน้าในแต่ละสตริงที่อยู่ภายในวงเล็บปีกกา จากนั้นคำนำหน้าจะถูกผนวกเข้ากับสตริงผลลัพธ์แต่ละสตริง โดยขยายจากซ้ายไปขวา
$ echo last{mce,boot,xorg}.log lastmce.log lastboot.log lastxorg.log where last is Preamble and .log is the postscript
คำสั่ง echo ข้างต้นช่วยให้คุณไม่ต้องระบุไฟล์บันทึกสามไฟล์แยกกัน หากคุณต้องการดูเนื้อหาของบันทึกการบูตครั้งล่าสุด บันทึก mce และบันทึก xorg คุณสามารถใช้การขยายวงเล็บปีกกาตามที่แสดงในคำสั่ง echo ด้านบน
1. ตัวอย่างการสำรองข้อมูลโดยใช้การขยายวงเล็บปีกกา
$ cat bkup.sh set -x # expand the commands da=`date +%F` cp $da.log{,.bak} $ ./bkup.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log 2010-05-28.log.bak
ในสคริปต์สำรองข้างต้น จะคัดลอกไฟล์บันทึกวันที่ปัจจุบันที่มีนามสกุล .bak องค์ประกอบแรกว่างเปล่าในวงเล็บปีกกา ดังนั้นองค์ประกอบแรกจะมีเพียงคำนำเท่านั้น
2. ตัวอย่างการคืนค่าโดยใช้การขยายวงเล็บปีกกา
$ cat restore.sh set -x # expand the commands da=`date +%F` cp $da.log{.bak,} $ ./restore.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log.bak 2010-05-28.log
ในสคริปต์กู้คืน องค์ประกอบแรกในพารามิเตอร์คือ .bak โดยที่องค์ประกอบที่สองว่างเปล่า
โปรดดูบทความก่อนหน้าของเราเกี่ยวกับฟังก์ชัน bash shell สำหรับการอ่านเพิ่มเติม
3. ตัวอย่างการขยาย Brace ที่ไม่มีคำนำและคำลงท้าย
หากไม่มีคำนำและคำลงท้าย ก็เพียงแค่ขยายองค์ประกอบที่ระบุในวงเล็บปีกกา
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
หากไม่มีสตริงคำนำและคำลงท้ายที่เป็นทางเลือก ผลลัพธ์จะเป็นเพียงรายการเว้นวรรคของสตริงที่กำหนด
ส่วนขยายรั้งสำหรับช่วง
ส่วนขยายรั้งขยายลำดับด้วย ลำดับอาจเป็นจำนวนเต็มหรืออักขระได้
4. ตัวอย่างลำดับจำนวนเต็มและอักขระ
$ cat sequence.sh cat /var/log/messages.{1..3} echo {a..f}{1..9}.txt $ ./sequence.sh May 9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s May 9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10 May 9 01:23:44 x3 ntpd[2413]: synchronized to May 9 01:47:48 x3 dhclient: DHCPREQUEST on eth0 May 9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201 .. .. a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt
คำสั่ง cat แรก ขยายข้อความ 1 ข้อความ 2 และข้อความ 3 และแสดงเนื้อหา และในอักขระคำสั่ง echo ถัดไปและลำดับจำนวนเต็มจะถูกรวมและใช้งาน
ลำดับที่มีค่าเพิ่มขึ้น
ในการขยายวงเล็บปีกกา kshell คุณสามารถใช้ค่าส่วนเพิ่มเพื่อสร้างลำดับได้
Syntax: <start>..<end>..<incr>
incr เป็นตัวเลข คุณสามารถใช้จำนวนเต็มลบได้ แต่เครื่องหมายที่ถูกต้องจะถูกอนุมานจากลำดับจุดเริ่มต้นและจุดสิ้นสุด
5. ตัวอย่างการใช้ Increment ตามลำดับ
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
เมื่อใช้สิ่งนี้ คุณจะเห็นล็อกไฟล์ของวันอื่น
ข้อผิดพลาดในการขยาย Brace
การขยายวงเล็บปีกกาไม่ขยายตัวแปร bash เนื่องจากการขยายวงเล็บปีกกาเป็นขั้นตอนแรกของการขยายเชลล์ ตัวแปรจะถูกขยายในภายหลัง
6. ตัวอย่างตัวแปรในการขยาย
หากคุณเห็นผลลัพธ์ของคำสั่งสองข้อต่อไปนี้ คุณสามารถระบุข้อผิดพลาดข้างต้นได้
$ cat var_seq.sh # Print 1 to 4 using sequences. for i in {1..4} do echo $i done start=1 end=4 # Print 1 to 4 using through variables echo "Sequences expressed using variables" for i in {$start..$end} do echo $i done $ ./var_seq.sh 1 2 3 4 Sequences expressed using variables {1..4}