<ก่อนหน้านี้ | Contents | ถัดไป>
การดำเนินการสตริง
มีส่วนขยายจำนวนมากที่สามารถใช้เพื่อดำเนินการกับสตริงได้ ส่วนขยายเหล่านี้จำนวนมากเหมาะอย่างยิ่งสำหรับการดำเนินการกับชื่อพาธ
-พารามิเตอร์}
ขยายเป็นความยาวของสตริงที่บรรจุโดย พารามิเตอร์. โดยปกติ พารามิเตอร์ เป็นสตริง; อย่างไรก็ตาม ถ้า พารามิเตอร์ เป็นทั้ง @ or *จากนั้นการขยายจะส่งผลให้จำนวนพารามิเตอร์ตำแหน่ง
[me@linuxbox ~]$ foo="สตริงนี้ยาว"
[me@linuxbox ~]$ echo "'$foo' มีความยาว ${#foo} อักขระ"
'สายนี้ยาว' มีความยาว 20 ตัวอักษร
[me@linuxbox ~]$ foo="สตริงนี้ยาว"
[me@linuxbox ~]$ echo "'$foo' มีความยาว ${#foo} อักขระ"
'สายนี้ยาว' มีความยาว 20 ตัวอักษร
${พารามิเตอร์:ชดเชย}
${พารามิเตอร์:ชดเชย:ความยาว}
ส่วนขยายเหล่านี้ใช้เพื่อแยกส่วนของสตริงที่อยู่ใน พารามิเตอร์. การสกัดเริ่มต้นที่ ชดเชย อักขระจากจุดเริ่มต้นของสตริงและดำเนินต่อไปจนถึงจุดสิ้นสุดของสตริง เว้นแต่ ความยาว ระบุไว้
[me@linuxbox ~]$ foo="สตริงนี้ยาว"
[me@linuxbox ~]$ เสียงสะท้อน ${foo:5}
สตริงยาว
[me@linuxbox ~]$ เสียงสะท้อน ${foo:5:6}
เชือก
[me@linuxbox ~]$ foo="สตริงนี้ยาว"
[me@linuxbox ~]$ เสียงสะท้อน ${foo:5}
สตริงยาว
[me@linuxbox ~]$ เสียงสะท้อน ${foo:5:6}
เชือก
ถ้าค่าของ ชดเชย เป็นค่าลบ หมายถึง เริ่มต้นจากจุดสิ้นสุดของสตริง แทนที่จะเป็นจุดเริ่มต้น โปรดทราบว่าค่าลบจะต้องนำหน้าด้วยช่องว่างเพื่อป้องกันความสับสนกับ ${พารามิเตอร์:-word} การขยายตัว ความยาวหากมีต้องไม่น้อยกว่าศูนย์
If พารามิเตอร์ is @, ผลของการขยายคือ ความยาว พารามิเตอร์ตำแหน่งเริ่มต้นที่
ชดเชย
[me@linuxbox ~]$ foo="สตริงนี้ยาว"
[me@linuxbox ~]$ เสียงสะท้อน ${foo: -5}
ยาว.
[me@linuxbox ~]$ เสียงสะท้อน ${foo: -5:2}
lo
[me@linuxbox ~]$ foo="สตริงนี้ยาว"
[me@linuxbox ~]$ เสียงสะท้อน ${foo: -5}
ยาว.
[me@linuxbox ~]$ เสียงสะท้อน ${foo: -5:2}
lo
${พารามิเตอร์#Belt hold }
${พารามิเตอร์##Belt hold }
การขยายเหล่านี้จะลบส่วนนำของสตริงที่อยู่ใน พารามิเตอร์ ที่กำหนดโดย Belt hold . Belt hold เป็นรูปแบบไวด์การ์ดเหมือนกับที่ใช้ในการขยายชื่อพาธ ความแตกต่างในทั้งสองรูปแบบคือ # แบบฟอร์มลบการจับคู่ที่สั้นที่สุดในขณะที่ ## แบบฟอร์มลบการแข่งขันที่ยาวที่สุด
[me@linuxbox ~]$ foo=file.txt.zip [me@linuxbox ~]$ เสียงสะท้อน ${foo#*.} txt.zip
[me@linuxbox ~]$ เสียงสะท้อน ${foo##*.}
ไปรษณีย์
[me@linuxbox ~]$ foo=file.txt.zip [me@linuxbox ~]$ เสียงสะท้อน ${foo#*.} txt.zip
[me@linuxbox ~]$ เสียงสะท้อน ${foo##*.}
ไปรษณีย์
${พารามิเตอร์%Belt hold }
${พารามิเตอร์%%Belt hold }
การขยายเหล่านี้เหมือนกับ # และ ## ส่วนขยายด้านบน ยกเว้นข้อความที่ท้ายสตริงที่อยู่ใน พารามิเตอร์ มากกว่าตั้งแต่ต้น
[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ เสียงสะท้อน ${foo%.*}
ไฟล์. txt
[me@linuxbox ~]$ เสียงสะท้อน ${foo%%.*}
ไฟล์
[me@linuxbox ~]$ เสียงสะท้อน ${foo%.*}
ไฟล์. txt
[me@linuxbox ~]$ เสียงสะท้อน ${foo%%.*}
ไฟล์
${พารามิเตอร์/Belt hold /เชือก}
${พารามิเตอร์//Belt hold /เชือก}
${พารามิเตอร์/#Belt hold /เชือก}
${พารามิเตอร์/%Belt hold /เชือก}
ส่วนขยายนี้ทำการค้นหาและแทนที่เนื้อหาของ พารามิเตอร์. หากพบว่าข้อความตรงกับสัญลักษณ์แทน Belt hold มันถูกแทนที่ด้วยเนื้อหาของ เชือก. ในรูปแบบปกติเฉพาะการเกิดขึ้นครั้งแรกของ Belt hold ถูกแทนที่ ใน // แบบฟอร์ม เหตุการณ์ทั้งหมดจะถูกแทนที่ ดิ /# แบบฟอร์มต้องการให้การแข่งขันเกิดขึ้นที่จุดเริ่มต้นของสตริงและ /% แบบฟอร์มต้องการให้มีการจับคู่ที่ส่วนท้ายของสตริง ในทุกรูปแบบ /เชือก อาจถูกละเว้นทำให้ข้อความตรงกับ Belt hold ที่จะถูกลบ
[me@linuxbox ~]$ ฟู=JPG.JPG [me@linuxbox ~]$ เสียงสะท้อน ${foo/JPG/jpg} jpg.JPG
[me@linuxbox ~]$ เสียงก้อง ${foo//JPG/jpg}
jpg.jpg
[me@linuxbox ~]$ เสียงสะท้อน ${foo/#JPG/jpg}
jpg.JPG
[me@linuxbox ~]$ เสียงสะท้อน ${foo/%JPG/jpg}
JPG.jpg
[me@linuxbox ~]$ ฟู=JPG.JPG [me@linuxbox ~]$ เสียงสะท้อน ${foo/JPG/jpg} jpg.JPG
[me@linuxbox ~]$ เสียงก้อง ${foo//JPG/jpg}
jpg.jpg
[me@linuxbox ~]$ เสียงสะท้อน ${foo/#JPG/jpg}
jpg.JPG
[me@linuxbox ~]$ เสียงสะท้อน ${foo/%JPG/jpg}
JPG.jpg
การขยายพารามิเตอร์เป็นสิ่งที่ดีที่ควรทราบ การขยายการจัดการสตริงสามารถใช้แทนคำสั่งทั่วไปอื่นๆ เช่น ความกระหายน้ำ และ ตัด. การขยายสามารถปรับปรุงประสิทธิภาพของสคริปต์โดยกำจัดการใช้โปรแกรมภายนอก ตัวอย่างเช่น เราจะแก้ไข คำที่ยาวที่สุด โปรแกรมที่กล่าวถึงในบทที่แล้วเพื่อใช้ขยายพารามิเตอร์ ${#เจ} แทนการทดแทนคำสั่ง $(echo .)
-n $j | wc -c) และ subshell ที่เป็นผลลัพธ์ เช่น:
#! / bin / ทุบตี
# longest-word3: ค้นหาสตริงที่ยาวที่สุดในไฟล์สำหรับ i; ทำ
ถ้า [[ -r $i ]]; แล้ว max_word= max_len=0
#! / bin / ทุบตี
# longest-word3: ค้นหาสตริงที่ยาวที่สุดในไฟล์สำหรับ i; ทำ
ถ้า [[ -r $i ]]; แล้ว max_word= max_len=0
สำหรับ j ใน $(สตริง $i); ทำ
เลน=${#j}
ถ้า (( len > max_len )); แล้ว max_len=$len max_word=$j
fi
ทำ
echo "$i: '$max_word' (อักขระไม่เกิน $max_len)"
เสร็จแล้ว
สำหรับ j ใน $(สตริง $i); ทำ
เลน=${#j}
ถ้า (( len > max_len )); แล้ว max_len=$len max_word=$j
fi
ทำ
echo "$i: '$max_word' (อักขระไม่เกิน $max_len)"
เสร็จแล้ว
ต่อไปเราจะเปรียบเทียบประสิทธิภาพของทั้งสองรุ่นโดยใช้คำสั่ง เวลา คำสั่ง:
[me@linuxbox ~]$ เวลาที่ยาวที่สุด-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 ตัวอักษร)
[me@linuxbox ~]$ เวลาที่ยาวที่สุด-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 ตัวอักษร)
จริง
ผู้ใช้งาน
0m3.618s
0m1.544s
จริง
ผู้ใช้งาน
ระบบ 0m1.768s
[me@linuxbox ~]$ เวลาที่ยาวที่สุด-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 ตัวอักษร)
ระบบ 0m1.768s
[me@linuxbox ~]$ เวลาที่ยาวที่สุด-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 ตัวอักษร)
จริง
ผู้ใช้งาน
0m0.060s
0m0.056s
จริง
ผู้ใช้งาน
ระบบ 0m0.008s
ระบบ 0m0.008s
สคริปต์เวอร์ชันดั้งเดิมใช้เวลา 3.618 วินาทีในการสแกนไฟล์ข้อความ ในขณะที่เวอร์ชันใหม่ใช้การขยายพารามิเตอร์ใช้เวลาเพียง 0.06 วินาที - การพิสูจน์ที่สำคัญมาก