Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Mở rộng Bash và shell:tạo danh sách lười biếng

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.