Lại đến thời điểm năm! Khi cửa hàng bắt đầu treo đồ nhựa lấp lánh màu sắc, chúng ta đều cảm thấy hơi festive, và festive ở đây nghĩa là đi shopping. Cụ thể, mua quà lễ! (Quà tự tặng vẫn là quà, về mặt kỹ thuật.)
Chỉ để mọi thứ không loạn lên, bạn nên tạo danh sách quà. Bash có thể giúp.
Brace expansion
Đây không phải braces: ()
Cũng không phải: []
Đây mới là braces: {}
Braces nói cho Bash làm gì đó với chuỗi tùy ý tìm thấy giữa chúng. Nhiều chuỗi cách nhau bởi dấu phẩy: {a,b,c}. Bạn cũng có thể thêm preamble và postscript tùy chọn gắn vào mỗi kết quả mở rộng. Phần lớn giúp tiết kiệm gõ, như với đường dẫn file và extension chung.
Hãy tạo danh sách cho mỗi người muốn tặng quà. Các lệnh sau tương đương:
touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txt
touch /home/me/gift-lists/{Amy,Bryan,Charlie}.txt
tree gift-lists
/home/me/gift-lists
├── Amy.txt
├── Bryan.txt
└── Charlie.txt
Ôi không, "Bryan" đánh vần tên với "i". Tôi sửa được.
mv /home/me/gift-lists/{Bryan,Brian}.txt
renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'
Shell parameter expansions
Shell parameter expansion cho phép làm mọi thứ thay đổi parameter trong braces, như manipulate và substitute text.
Có vài quà nhỏ tất cả giftees đều xứng đáng. Hãy làm biến:
STUFF=$'socks\nlump of coal\nwhite chocolate'
echo "$STUFF"
socks
lump of coal
white chocolate
Bây giờ thêm item này vào từng danh sách với giúp của lệnh tee để echo và expansion chơi tốt với nhau.
echo "$STUFF" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate
Pattern match substitution
Lúc sau nghĩ lại, có lẽ lump of coal không phải quà hay. Bạn có thể thay bằng thứ tốt hơn dùng pattern match substitution dạng ${parameter/pattern/string}:
echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
socks
candy cane
white chocolate
socks
candy cane
white chocolate
Thay thế instance đầu của "lump of coal" bằng "candy cane". Để thay tất cả instance (nếu nhiều), dùng ${parameter//pattern/string}. Điều này không thay biến $STUFF, nên vẫn dùng lại list gốc cho ai hư sau.
Substrings
Khi đang cải thiện, giftees có thể không thích white chocolate. Tốt hơn thêm regular chocolate vào list. Vì tôi lười, tôi chỉ bấm mũi tên lên và sửa lệnh Bash trước. May thay, từ cuối trong $STUFF là "chocolate", dài 9 ký tự, nên tôi bảo Bash giữ phần đó dùng ${parameter:offset}. Dùng cờ -a của tee để append vào list hiện có:
echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate
Bạn cũng có thể:
| Làm này | Với này |
|---|---|
| Lấy substring từ n ký tự trở đi | ${parameter:n} |
| Lấy substring x ký tự bắt đầu tại n | ${parameter:n:x} |
Xong! Base list đã xong. Hãy uống eggnog.
Test biến
Bạn biết, có lẽ do eggnog, nhưng tôi nghĩ tôi tạo list cho Amy hôm qua và lưu trong biến có thể tên amy. Xem nào. Dùng expansion ${parameter:?word}. Nó ghi word ra standard error và exit nếu không có parameter amy.
echo "${amy:?no such}"
bash: amy: no such
Hình như không. Có lẽ là Brian?
echo "${brian:?no such}"
Lederhosen
Bạn cũng có thể:
| Làm này | Với này |
|---|---|
Thay thế word nếu parameter unset hoặc null |
${parameter:-word} |
Thay thế word nếu parameter không unset hoặc null |
${parameter:+word} |
Gán word cho parameter nếu unset hoặc null |
${parameter:=word} |
Thay đổi chữ hoa/thường
Đúng rồi! Brian nói muốn lederhosen nên tôi note. Điều này quan trọng, thêm vào list Brian in HOA với expansion ${parameter^^pattern}. Phần pattern tùy chọn. Chỉ ghi vào list Brian, nên dùng >> thay tee -a.
echo "${brian^^}" >> Brian.txt
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN
Bạn cũng có thể:
| Làm này | Với này |
|---|---|
| Viết hoa chữ cái đầu | ${parameter^pattern} |
| Viết thường chữ cái đầu | ${parameter,pattern} |
| Viết thường tất cả | ${parameter,,pattern} |
Mở rộng mảng
Biết gì, việc list quà này nhiều việc. Tôi chỉ tạo mảng đồ thấy ở cửa hàng:
gifts=(sweater gameboy wagon pillows chestnuts hairbrush)
Tôi dùng substring expansion dạng ${parameter:offset:length} làm đơn giản. Thêm 2 đầu cho Amy, 2 giữa cho Brian, 2 cuối cho Charlie. Dùng printf giúp newline.
printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt
printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt
printf '%s\n' "${gifts[@]: -2}" >> Charlie.txt
cat Amy.txt
socks
candy cane
white chocolate
chocolate
sweater
gameboy
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN
wagon
pillows
cat Charlie.txt
socks
candy cane
white chocolate
chocolate
chestnuts
hairbrush
Xong! Bây giờ chúng ta có bộ danh sách quà siêu cá nhân hóa. Cảm ơn Bash! Tiếc là không làm hộ shopping thêm.