Mở rộng Bash Shell
Một trong những hoạt động của shell khi nó phân tích đầu vào là Shell mở rộng. Bash cung cấp các loại mở rộng khác nhau. Trong bài viết này, hãy để chúng tôi xem xét một phần mở rộng quan trọng - "Mở rộng dấu ngoặc".
Bài viết này là một phần của loạt bài Hướng dẫn về Bash đang thực hiện của chúng tôi.
Mở rộng Brace
Mở rộng dấu ngoặc nhọn được sử dụng để tạo chuỗi tùy ý. Mở rộng dấu ngoặc nhọn cho phép bạn tạo nhiều đối số dòng lệnh được sửa đổi từ một đối số duy nhất. Các chuỗi được chỉ định được sử dụng để tạo ra tất cả các kết hợp có thể có với phần mở đầu và mô tả sau tùy chọn xung quanh. Phần mở đầu được đặt trước cho mỗi chuỗi có trong dấu ngoặc nhọn và phần tái bút sau đó được nối 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 lệnh echo ở trên tránh cho bạn chỉ định ba tệp nhật ký riêng biệt. Nếu bạn muốn xem nội dung của nhật ký khởi động cuối cùng, nhật ký mce và nhật ký xorg, bạn có thể sử dụng mở rộng dấu ngoặc nhọn như được hiển thị trong câu lệnh echo ở trên.
1. Ví dụ về Sao lưu bằng cách sử dụng mở rộng dấu 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 tập lệnh sao lưu ở trên, nó sao chép tệp nhật ký ngày hiện tại với phần mở rộng là .bak. Phần tử đầu tiên trống trong dấu ngoặc nhọn, vì vậy phần tử đầu tiên sẽ chỉ có phần mở đầu.
2. Ví dụ về Khôi phục bằng cách sử dụng mở rộng dấu 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 tập lệnh khôi phục, phần tử đầu tiên trong tham số là .bak trong đó phần tử thứ hai trống.
Ngoài ra, hãy tham khảo bài viết trước của chúng tôi về các hàm bash shell để đọc thêm.
3. Ví dụ cho Mở rộng Brace không có phần mở đầu và phần tái bút
Nếu không có phần mở đầu và phần tái bút, nó chỉ mở rộng các phần tử được cho trong dấu ngoặc nhọn.
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
Nếu không có các chuỗi phần mở đầu và phần tái bút tùy chọn, kết quả chỉ là danh sách các chuỗi đã cho được phân tách bằng dấu cách
Mở rộng dấu ngoặc cho Dãy
Mở rộng dấu ngoặc kép cũng mở rộng các trình tự. Các chuỗi có thể là số nguyên hoặc ký tự.
4. Ví dụ cho chuỗi ký tự và số nguyên
$ 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
Lệnh mèo đầu tiên, mở rộng các tin nhắn.1, tin nhắn.2 và tin nhắn.3 và hiển thị nội dung. và trong câu lệnh echo tiếp theo, ký tự và chuỗi số nguyên được kết hợp và sử dụng.
Các chuỗi có giá trị tăng dần
Trong phần mở rộng dấu ngoặc nhọn kshell, bạn có thể sử dụng giá trị tăng dần, để tạo các chuỗi.
Syntax: <start>..<end>..<incr>
incr là số. Bạn có thể sử dụng số nguyên âm, nhưng dấu đúng được suy ra từ thứ tự bắt đầu và kết thúc.
5. Ví dụ về việc sử dụng Tăng dần theo chuỗi
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
Sử dụng điều này, bạn có thể thấy các nhật ký ngày thay thế.
Mở rộng cạm bẫy trong Brace
Mở rộng dấu ngoặc nhọn không mở rộng các biến bash, bởi vì mở rộng dấu ngoặc nhọn là bước đầu tiên của việc mở rộng hệ vỏ, biến sẽ được mở rộng sau đó.
6. Ví dụ về Biến trong mở rộng
Nếu bạn thấy kết quả của hai câu lệnh for sau, bạn có thể xác định được lỗi ở 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}