ใน bash shell เมื่อคุณใช้เครื่องหมายดอลลาร์ตามด้วยชื่อตัวแปร เชลล์จะขยายตัวแปรด้วยค่าของมัน คุณลักษณะของเชลล์นี้เรียกว่าการขยายพารามิเตอร์
แต่การขยายพารามิเตอร์มีรูปแบบอื่นๆ มากมายที่ช่วยให้คุณขยายพารามิเตอร์และแก้ไขค่าหรือแทนที่ค่าอื่นๆ ในกระบวนการขยายได้ ในบทความนี้ ให้เราทบทวนวิธีใช้แนวคิดการขยายพารามิเตอร์สำหรับการดำเนินการจัดการสตริง
บทความนี้เป็นส่วนหนึ่งของชุดการสอนทุบตีที่กำลังดำเนินอยู่ อ้างถึงบทความก่อนหน้าของเราเกี่ยวกับ bash { } ส่วนขยาย
1. ระบุความยาวของสตริงภายใน Bash Shell Script
${#string}
รูปแบบข้างต้นใช้เพื่อรับความยาวของตัวแปร bash ที่กำหนด
$ cat len.sh #! /bin/bash var="Welcome to the geekstuff" echo ${#var} $ ./len.sh 24
หากต้องการทำความเข้าใจเพิ่มเติมเกี่ยวกับตัวแปร bash ให้อ่านตัวอย่าง Bash Global และ Local Variable 6 ตัวอย่าง
2. แยกสตริงย่อยจากตัวแปรภายใน Bash Shell Script
Bash มีวิธีแยกสตริงย่อยออกจากสตริง ตัวอย่างต่อไปนี้จะอธิบายวิธีแยกวิเคราะห์อักขระ n ตัวโดยเริ่มจากตำแหน่งใดตำแหน่งหนึ่ง
${string:position}
แยกสตริงย่อยจาก $string ที่ $position
${string:position:length}
แยกความยาว $ ของสตริงย่อยของอักขระจาก $string เริ่มต้นจากตำแหน่ง $ ในตัวอย่างด้านล่าง คำสั่ง echo แรกจะส่งคืนสตริงย่อยที่เริ่มต้นจากตำแหน่งที่ 15 คำสั่ง echo ที่สองส่งคืนอักขระ 4 ตัวโดยเริ่มจากตำแหน่งที่ 15 ความยาวต้องเป็นตัวเลขที่มากกว่าหรือเท่ากับศูนย์
$ cat substr.sh #! /bin/bash var="Welcome to the geekstuff" echo ${var:15} echo ${var:15:4} $ ./substr.sh geekstuff geek
โปรดดูบทความก่อนหน้าของเราเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับ $*, $@, $#, $$, $!, $?, $-, $_ bash พารามิเตอร์พิเศษ
3. การจับคู่สตริงย่อยที่สั้นที่สุด
ไวยากรณ์ต่อไปนี้จะลบการจับคู่ที่สั้นที่สุดของ $substring จากด้านหน้าของ $string
${string#substring}
ไวยากรณ์ต่อไปนี้จะลบการจับคู่ที่สั้นที่สุดของ $substring จากด้านหลังของ $string
${string%substring}
ตัวอย่างเชลล์สคริปต์ต่อไปนี้จะอธิบายแนวคิดการจับคู่สตริงย่อยที่สั้นที่สุดสองข้อข้างต้น
$ cat shortest.sh #! /bin/bash filename="bash.string.txt" echo ${filename#*.} echo ${filename%.*} $ ./shortest.sh After deletion of shortest match from front: string.txt After deletion of shortest match from back: bash.string
ในสตริงย่อยคำสั่ง echo แรก '*.' จะจับคู่อักขระและจุด และ # แถบจากด้านหน้าของสตริง ดังนั้นจึงตัดสตริงย่อย "bash" จากตัวแปรที่เรียกว่าชื่อไฟล์ ในสตริงย่อยคำสั่ง echo ที่สอง '.*' จะจับคู่สตริงย่อยที่ขึ้นต้นด้วย dot และแถบ % จากด้านหลังของสตริง ดังนั้นจึงลบสตริงย่อย '.txt'
4. การจับคู่สตริงย่อยที่ยาวที่สุด
ไวยากรณ์ต่อไปนี้จะลบการจับคู่ที่ยาวที่สุดของ $substring จากด้านหน้าของ $string
${string##substring}
ไวยากรณ์ต่อไปนี้จะลบการจับคู่ที่ยาวที่สุดของ $substring จากด้านหลังของ $string
${string%%substring}
ตัวอย่างเชลล์สคริปต์ต่อไปนี้จะอธิบายแนวคิดการจับคู่สตริงย่อยที่ยาวที่สุดสองข้อข้างต้น
$ cat longest.sh #! /bin/bash filename="bash.string.txt" echo "After deletion of longest match from front:" ${filename##*.} echo "After deletion of longest match from back:" ${filename%%.*} $ ./longest.sh After deletion of longest match from front: txt After deletion of longest match from back: bash
ในตัวอย่างข้างต้น ##* ตัดการจับคู่ที่ยาวที่สุดสำหรับ '*.' ซึ่งตรงกับ "bash.string" ดังนั้นหลังจากสไทรพ์สิ่งนี้ มันจะพิมพ์ txt ที่เหลือ และ %%.* จะตัดการจับคู่ที่ยาวที่สุดสำหรับ .* จากด้านหลังซึ่งตรงกับ “.string.txt” หลังจากสตริปแล้ว ผลลัพธ์ที่ได้จะกลับเป็น “bash”
5. ค้นหาและแทนที่ค่าสตริงภายใน Bash Shell Script
แทนที่เฉพาะนัดแรก
${string/pattern/replacement}
โดยจะจับคู่รูปแบบในตัวแปร $string และแทนที่เฉพาะการจับคู่แรกของรูปแบบด้วยการแทนที่
$ cat firstmatch.sh #! /bin/bash filename="bash.string.txt" echo "After Replacement:" ${filename/str*./operations.} $ ./firstmatch.sh After Replacement: bash.operations.txt
แทนที่การแข่งขันทั้งหมด
${string//pattern/replacement}
มันแทนที่การจับคู่ของรูปแบบทั้งหมดด้วยการแทนที่
$ cat allmatch.sh #! /bin/bash filename="Path of the bash is /bin/bash" echo "After Replacement:" ${filename//bash/sh} $ ./allmatch.sh After Replacement: Path of the sh is /bin/sh
เกี่ยวกับการค้นหาและแทนที่ อ้างถึงบทความก่อนหน้าของเรา – ตัวอย่างการแทนที่ และ Vim ค้นหาและแทนที่
เปลี่ยนจุดเริ่มต้นและจุดสิ้นสุด
${string/#pattern/replacement}
ไวยากรณ์ต่อไปนี้จะแทนที่ด้วยสตริงการแทนที่ เฉพาะเมื่อรูปแบบตรงกับจุดเริ่มต้นของ $string
${string/%pattern/replacement}
ไวยากรณ์ต่อไปนี้จะแทนที่ด้วยสตริงการแทนที่ เฉพาะเมื่อรูปแบบตรงกันที่ส่วนท้ายของ $string ที่กำหนด
$ cat posmatch.sh #! /bin/bash filename="/root/admin/monitoring/process.sh" echo "Replaced at the beginning:" ${filename/#\/root/\/tmp} echo "Replaced at the end": ${filename/%.*/.ksh} $ ./posmatch.sh Replaced at the beginning: /tmp/admin/monitoring/process.sh Replaced at the end: /root/admin/monitoring/process.ksh
แนะนำให้อ่าน
Bash 101 Hacks โดย Ramesh Natarajan . ฉันใช้เวลาส่วนใหญ่กับสภาพแวดล้อม Linux โดยธรรมชาติแล้วฉันเป็นแฟนตัวยงของ Bash command line และ shell scripting 15 ปีที่แล้ว ตอนที่ฉันทำงานกับ *nix รสชาติต่างๆ ฉันเคยเขียนโค้ดจำนวนมากบน C shell และ Korn shell หลายปีต่อมา เมื่อฉันเริ่มทำงานบน Linux ในฐานะผู้ดูแลระบบ ฉันทำได้ค่อนข้างอัตโนมัติทุกงานที่เป็นไปได้โดยใช้ Bash shell scripting จากประสบการณ์ Bash ของฉัน ฉันได้เขียน Bash 101 Hacks eBook ที่มีตัวอย่างเชิงปฏิบัติ 101 ตัวอย่างทั้งบรรทัดคำสั่ง Bash และเชลล์สคริปต์ หากคุณกำลังคิดเกี่ยวกับการควบคุม Bash ให้เชี่ยวชาญ ลองอ่านหนังสือเล่มนี้ดู ซึ่งจะช่วยให้คุณควบคุมบรรทัดคำสั่งและเชลล์สคริปต์ของ Bash ได้