Lại là thời điểm đó trong năm! Khi các cửa hàng bắt đầu bày bán những miếng nhựa sáng lấp lánh đầy màu sắc, tất cả chúng ta bắt đầu cảm thấy một chút lễ hội và ý tôi là lễ hội chúng ta hãy đi mua sắm. Cụ thể, mua sắm quà tặng kỳ nghỉ! (Về mặt kỹ thuật, quà tặng cho bản thân vẫn là quà tặng.)
Để điều này không hoàn toàn trở nên điên rồ, bạn nên lập một số danh sách quà tặng. Bash có thể giúp ích.
Mở rộng dấu ngoặc nhọn
Đây không phải là dấu ngoặc nhọn:()
Cả hai đều không:[]
Những là dấu ngoặc nhọn:{}
Dấu ngoặc nhọn cho Bash làm điều gì đó với chuỗi hoặc chuỗi tùy ý mà nó tìm thấy giữa chúng. Nhiều chuỗi được phân tách bằng dấu phẩy:{a,b,c}
. Bạn cũng có thể thêm phần mở đầu và phần tái bút tùy chọn để đính kèm vào mỗi kết quả mở rộng. Hầu hết, điều này có thể tiết kiệm một số thao tác nhập, chẳng hạn như với các đường dẫn và phần mở rộng tệp phổ biến.
Hãy tạo một số danh sách cho từng người mà chúng ta muốn cung cấp nội dung cho họ. Các lệnh sau là 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 trời, “Bryan” đánh vần tên anh ấy bằng chữ “i”. Tôi có thể sửa lỗi đó.
mv /home/me/gift-lists/{Bryan,Brian}.txt
renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'
Các bản mở rộng tham số Shell
Mở rộng tham số Shell cho phép chúng tôi thực hiện tất cả các loại thay đổi đối với các tham số được đặt trong dấu ngoặc nhọn, như thao tác và thay thế văn bản.
Có một vài đồ lót có sẵn mà tất cả các bạn gái của chúng ta đều xứng đáng có được. Hãy biến điều đó thành một biến:
STUFF=$'socks\nlump of coal\nwhite chocolate'
echo "$STUFF"
socks
lump of coal
white chocolate
Bây giờ để thêm các mục này vào từng danh sách của chúng tôi với một số trợ giúp từ tee
lệnh để lấy echo
và mở rộng để chơi tốt.
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
Thay thế đối sánh mẫu
Theo suy nghĩ thứ hai, có lẽ một cục than không phải là một món quà tốt như vậy. Bạn có thể thay thế nó bằng thứ gì đó tốt hơn bằng cách sử dụng thay thế đối sánh mẫu ở 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
Điều này thay thế trường hợp đầu tiên của “cục than” bằng “cây kẹo”. Để thay thế tất cả các phiên bản (nếu có nhiều phiên bản), hãy sử dụng ${parameter//pattern/string}
. Điều này không thay đổi $STUFF
của chúng tôi biến, vì vậy chúng tôi vẫn có thể sử dụng lại danh sách ban đầu cho một người nào đó nghịch ngợm sau này.
Chuỗi con
Trong khi chúng tôi đang cải thiện mọi thứ, những người ủng hộ của chúng tôi có thể không thích sô cô la trắng. Tốt hơn chúng ta nên thêm một số loại sô cô la thông thường vào danh sách của mình để đề phòng. Vì tôi cực kỳ lười biếng, tôi sẽ chỉ cần nhấn vào mũi tên lên và sửa đổi lệnh Bash trước đó. May mắn thay, từ cuối cùng trong $STUFF
biến là “sô cô la”, dài chín ký tự, vì vậy tôi sẽ yêu cầu Bash chỉ giữ lại phần đó bằng cách sử dụng ${parameter:offset}
. Tôi sẽ sử dụng tee
Của -a
gắn cờ cho a
chi tiêu vào danh sách hiện có của tôi:
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 điều này | Với điều này |
---|---|
Nhận chuỗi con từ n ký tự trở đi | ${parameter:n} |
Nhận chuỗi con cho x các ký tự bắt đầu bằng n | ${parameter:n:x} |
Ở đó! Bây giờ danh sách cơ sở của chúng tôi đã hoàn thành. Hãy ăn một ít trứng.
Các biến kiểm tra
Bạn biết đấy, đó có thể là eggnog, nhưng tôi nghĩ rằng tôi đã bắt đầu một danh sách cho Amy vào ngày hôm qua và lưu trữ nó trong một biến mà tôi có thể đã gọi là amy
. Hãy xem nếu tôi đã làm. Tôi sẽ sử dụng ${parameter:?word}
sự bành trướng. Nó sẽ viết word
đến lỗi chuẩn và thoát nếu không có amy
tham số.
echo "${amy:?no such}"
bash: amy: no such
Tôi đoán là không. Có lẽ thay vào đó là Brian?
echo "${brian:?no such}"
Lederhosen
Bạn cũng có thể:
Làm điều này | Với điều này |
---|---|
Thay thế word if parameter không được đặt hoặc không có giá trị | ${parameter:-word} |
Thay thế word if parameter không được đặt hoặc không có giá trị | ${parameter:+word} |
Gán word thành parameter if parameter không được đặt hoặc không có giá trị | ${parameter:=word} |
Thay đổi trường hợp
Đúng rồi! Brian nói rằng anh ấy muốn một số người dẫn đầu và vì vậy tôi đã ghi chú lại cho mình. Điều này khá quan trọng, vì vậy tôi sẽ thêm nó vào danh sách của Brian bằng chữ in hoa với ${parameter^^pattern}
sự bành trướng. pattern
một phần là tùy chọn. Chúng tôi chỉ viết thư cho danh sách của Brian, vì vậy tôi sẽ chỉ sử dụng >>
thay vì tee -a
.
echo "${brian^^}" >> Brian.txt
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN
Bạn cũng có thể:
Làm điều này | Với điều này |
---|---|
Viết hoa chữ cái đầu tiên | ${parameter^pattern} |
Viết thường chữ cái đầu tiên | ${parameter,pattern} |
Viết thường tất cả các chữ cái | ${parameter,,pattern} |
Mở rộng mảng
Bạn biết không, tất cả công việc kinh doanh danh sách quà tặng này là rất nhiều công việc. Tôi sẽ chỉ làm một loạt những thứ tôi đã thấy ở cửa hàng:
gifts=(sweater gameboy wagon pillows chestnuts hairbrush)
Tôi có thể sử dụng mở rộng chuỗi con ở dạng ${parameter:offset:length}
để làm cho điều này đơn giản. Tôi sẽ thêm hai người đầu tiên vào danh sách của Amy, hai người ở giữa vào danh sách của Brian và hai người cuối cùng vào danh sách của Charlie. Tôi sẽ sử dụng printf
để trợ giúp với các dòng mới.
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
Ở đó! Giờ đây, chúng tôi đã có một bộ danh sách quà tặng siêu cá nhân hóa toàn diện. Cảm ơn Bash! Thật tệ là nó cũng không thể mua sắm cho chúng tôi.