Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

บทช่วยสอนการขยาย Bash Brace:6 ตัวอย่างการขยายนิพจน์ภายในวงเล็บปีกกา

การขยาย Bash Shell

บทช่วยสอนการขยาย Bash Brace:6 ตัวอย่างการขยายนิพจน์ภายในวงเล็บปีกกาหนึ่งในการทำงานของเชลล์เมื่อวิเคราะห์อินพุตคือการขยายเชลล์ 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}