Trong bash shell, khi bạn sử dụng dấu dollar theo sau bằng tên biến, shell sẽ mở rộng biến với giá trị của nó. Tính năng này của shell được gọi là mở rộng tham số (parameter expansion).
Nhưng mở rộng tham số có nhiều dạng khác nhau cho phép bạn mở rộng một tham số và sửa đổi giá trị hoặc thay thế các giá trị khác trong quá trình mở rộng. Trong bài viết này, chúng ta sẽ xem xét cách sử dụng khái niệm mở rộng tham số cho các thao tác chuỗi.
Bài viết này là một phần của loạt bài hướng dẫn bash đang diễn ra. Tham khảo bài trước về mở rộng ngoặc nhọn { } trong bash.
1. Xác Định Độ Dài Chuỗi Bên Trong Script Shell Bash
${#string}
Định dạng trên được dùng để lấy độ dài của biến bash cho trước.
$ cat len.sh
#! /bin/bash
var="Welcome to the geekstuff"
echo ${#var}
$ ./len.sh
24
Để hiểu thêm về biến bash, hãy đọc 6 Ví Dụ Thực Tế Biến Toàn Cục và Cục Bộ Bash.
2. Trích Xuất Chuỗi Con Từ Biến Bên Trong Script Shell Bash
Bash cung cấp cách để trích xuất một chuỗi con từ một chuỗi. Ví dụ sau giải thích cách phân tích n ký tự bắt đầu từ một vị trí cụ thể.
${string:position}
Trích xuất chuỗi con từ $string tại $position
${string:position:length}
Trích xuất $length ký tự chuỗi con từ $string bắt đầu từ $position. Trong ví dụ dưới, câu echo đầu tiên trả về chuỗi con bắt đầu từ vị trí 15. Câu echo thứ hai trả về 4 ký tự bắt đầu từ vị trí 15. Độ dài phải là số lớn hơn hoặc bằng 0.
$ cat substr.sh
#! /bin/bash
var="Welcome to the geekstuff"
echo ${var:15}
echo ${var:15:4}
$ ./substr.sh
geekstuff
geek
Cũng tham khảo bài trước để hiểu thêm về các tham số đặc biệt bash: $*, $@, $#, $$, $!, $?, $-, $_.
3. Khớp Chuỗi Con Ngắn Nhất
Cú pháp sau xóa khớp ngắn nhất của $substring từ đầu của $string
${string#substring}
Cú pháp sau xóa khớp ngắn nhất của $substring từ cuối của $string
${string%substring}
Script shell mẫu sau giải thích hai khái niệm khớp chuỗi con ngắn nhất trên.
$ 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
Trong câu echo đầu tiên, chuỗi con '*.' khớp các ký tự và một dấu chấm, và # xóa từ đầu chuỗi, nên nó xóa chuỗi con "bash." từ biến filename. Trong câu echo thứ hai, chuỗi con '.*' khớp chuỗi con bắt đầu bằng dấu chấm, và % xóa từ cuối chuỗi, nên nó xóa chuỗi con '.txt'.
4. Khớp Chuỗi Con Dài Nhất
Cú pháp sau xóa khớp dài nhất của $substring từ đầu của $string
${string##substring}
Cú pháp sau xóa khớp dài nhất của $substring từ cuối của $string
${string%%substring}
Script shell mẫu sau giải thích hai khái niệm khớp chuỗi con dài nhất trên.
$ 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
Trong ví dụ trên, ##*. xóa khớp dài nhất cho '*.' khớp với "bash.string.", nên sau khi xóa nó in phần còn lại txt. Và %%.* xóa khớp dài nhất cho .* từ cuối khớp với ".string.txt", sau khi xóa trả về "bash".
5. Tìm Kiếm và Thay Thế Giá Trị Chuỗi Bên Trong Script Shell Bash
Chỉ Thay Thế Khớp Đầu Tiên
${string/pattern/replacement}
Nó khớp mẫu trong biến $string, và chỉ thay thế khớp đầu tiên của mẫu bằng chuỗi thay thế.
$ cat firstmatch.sh
#! /bin/bash
filename="bash.string.txt"
echo "After Replacement:" ${filename/str*./operations.}
$ ./firstmatch.sh
After Replacement: bash.operations.txt
Thay Thế Tất Cả Các Khớp
${string//pattern/replacement}
Nó thay thế tất cả các khớp của mẫu bằng chuỗi thay thế.
$ 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
Về tìm kiếm và thay thế, tham khảo các bài trước: ví dụ sed substitute và Vim find and replace.
Thay Thế Đầu và Cuối
${string/#pattern/replacement}
Cú pháp sau thay thế bằng chuỗi thay thế, chỉ khi mẫu khớp đầu của $string.
${string/%pattern/replacement}
Cú pháp sau thay thế bằng chuỗi thay thế, chỉ khi mẫu khớp ở cuối của $string cho trước.
$ 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
Đọc Thêm
Bash 101 Hacks, tác giả Ramesh Natarajan. Tôi dành hầu hết thời gian trên môi trường Linux. Vì vậy, tự nhiên tôi là một fan hâm mộ của dòng lệnh Bash và shell scripting. 15 năm trước, khi tôi làm việc trên các hương *nix khác nhau, tôi thường viết nhiều mã trên C shell và Korn shell. Những năm sau, khi bắt đầu làm quản trị hệ thống trên Linux, tôi đã tự động hóa hầu hết mọi tác vụ có thể bằng Bash shell scripting. Dựa trên kinh nghiệm Bash, tôi đã viết eBook Bash 101 Hacks chứa 101 ví dụ thực tế về cả dòng lệnh Bash và shell scripting. Nếu bạn đang suy nghĩ về việc thành thạo Bash, hãy làm ơn đọc cuốn sách này, nó sẽ giúp bạn kiểm soát dòng lệnh Bash và shell scripting của mình.