เวิร์กสเตชันออนไลน์ของ OnWorks Linux และ Windows

โลโก้

ฟรีโฮสติ้งออนไลน์สำหรับเวิร์กสเตชัน

<ก่อนหน้านี้ | 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 วินาที-การพิสูจน์ที่สำคัญมาก


ระบบปฏิบัติการคลาวด์คอมพิวติ้งยอดนิยมที่ OnWorks: