Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Thành Thạo Mở Rộng Ngoặc Nhọn Bash: 6 Ví Dụ Thực Tế

Mở Rộng Shell Bash

Thành Thạo Mở Rộng Ngoặc Nhọn Bash: 6 Ví Dụ Thực TếMột trong các thao tác của shell khi nó phân tích đầu vào là Mở rộng Shell (Shell expansion). Bash cung cấp các loại mở rộng khác nhau. Trong bài này, chúng ta sẽ xem lại một mở rộng quan trọng — "Mở rộng ngoặc nhọn" (Brace expansion).

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.

Mở Rộng Ngoặc Nhọn (Brace Expansion)

Mở rộng ngoặc nhọn được dùng để tạo chuỗi tùy ý. Mở rộng ngoặc nhọn cho phép bạn tạo nhiều đối số dòng lệnh sửa đổi từ một đối số đơn. Các chuỗi chỉ định được dùng để tạo tất cả tổ hợp có thể với tiền tố và hậu tố tùy chọn. Tiền tố được thêm trước mỗi chuỗi chứa trong ngoặc, và hậu tố sau đó được nối thêm vào mỗi chuỗi kết quả, mở rộng từ trái sang phải.

$ echo last{mce,boot,xorg}.log
lastmce.log lastboot.log lastxorg.log
where last is Preamble and .log is the postscript

Câu echo trên giúp bạn tránh chỉ định ba file log riêng biệt. Nếu bạn muốn xem nội dung last boot log, mce log và xorg log, bạn có thể dùng mở rộng ngoặc nhọn như câu echo trên.

1. Ví Dụ Backup Sử Dụng Mở Rộng Ngoặc Nhọn

$ 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

Trong script backup trên, nó copy file log ngày hiện tại với phần mở rộng .bak. Phần tử đầu tiên rỗng trong ngoặc, nên phần tử đầu chỉ có tiền tố.

2. Ví Dụ Restore Sử Dụng Mở Rộng Ngoặc Nhọn

$ 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

Trong script restore, phần tử đầu trong tham số là .bak trong khi phần tử thứ hai rỗng.

Cũng tham khảo bài trước về hàm shell bash để đọc thêm.

3. Ví Dụ Mở Rộng Ngoặc Nhọn Không Có Tiền Tố Và Hậu Tố

Nếu không có tiền tố và hậu tố, nó chỉ mở rộng các phần tử cho trong ngoặc.

$ cat expand.sh
echo {oct,hex,dec,bin}
$ ./expand.sh
oct hex dec bin

Không có chuỗi tiền tố và hậu tố tùy chọn, kết quả chỉ là danh sách phân tách bằng khoảng trắng các chuỗi cho trước.

Mở Rộng Ngoặc Nhọn Cho Phạm Vi (Ranges)

Mở rộng ngoặc nhãn cũng mở rộng các dãy (sequences). Các dãy có thể là số nguyên hoặc ký tự.

4. Ví Dụ Dãy Số Nguyên Và Ký Tự

$ 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

Câu cat đầu tiên, mở rộng messages.1, messages.2 và messages.3 và hiển thị nội dung. Và trong câu echo tiếp theo, dãy ký tự và số nguyên được kết hợp và dùng.

Dãy Với Giá Tăng (Increment)

Trong kshell brace expansion, bạn có thể dùng giá trị tăng, để tạo dãy.

Syntax: <start>..<end>..<incr>

incr là số. Bạn có thể dùng số âm, nhưng dấu đúng được suy ra từ thứ tự start và end.

5. Ví Dụ Dùng Tăng Trong Dãy

$ ksh
$ echo /var/log/messages.{1..7..2}
/var/log/messages.1
/var/log/messages.3
/var/log/messages.5
/var/log/messages.7
$

Dùng này bạn có thể xem file log ngày cách ngày.

Cạm Bẫy Trong Mở Rộng Ngoặc Nhọn

Mở rộng ngoặc nhọn không mở rộng biến bash, vì mở rộng ngoặc nhọn là bước đầu tiên của shell expansion, biến sẽ được mở rộng sau.

6. Ví Dụ Biến Trong Mở Rộng

Nếu bạn thấy đầu ra của hai câu for sau, bạn có thể nhận diện cạm bẫy trên.

$ 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}