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

5 cách để cải thiện tập lệnh Bash của bạn

Một quản trị viên hệ thống thường viết các tập lệnh Bash, một số ngắn và một số khá dài, để hoàn thành các nhiệm vụ khác nhau.

Bạn đã bao giờ nhìn vào một tập lệnh cài đặt được cung cấp bởi một nhà cung cấp phần mềm chưa? Họ thường thêm nhiều chức năng và logic để đảm bảo rằng việc cài đặt hoạt động bình thường và không gây hư hỏng cho hệ thống của khách hàng. Qua nhiều năm, tôi đã tích lũy được một bộ sưu tập các kỹ thuật khác nhau để cải thiện các tập lệnh Bash của mình và tôi muốn chia sẻ một số kỹ thuật trong số đó với hy vọng chúng có thể giúp ích cho những người khác. Dưới đây là một bộ sưu tập các tập lệnh nhỏ được tạo để minh họa những ví dụ đơn giản này.

Bắt đầu

Khi tôi mới bắt đầu, các tập lệnh Bash của tôi chỉ là một chuỗi lệnh, thường có nghĩa là để tiết kiệm thời gian với các hoạt động shell tiêu chuẩn như triển khai nội dung web. Một trong những nhiệm vụ đó là trích xuất nội dung tĩnh vào thư mục chính của máy chủ web Apache. Tập lệnh của tôi giống như thế này:

cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz

Mặc dù điều này đã giúp tôi tiết kiệm được một khoảng thời gian và việc đánh máy, nhưng chắc chắn nó không phải là một tập lệnh rất thú vị hoặc hữu ích về lâu dài. Theo thời gian, tôi đã học được các cách khác để sử dụng tập lệnh Bash để hoàn thành các nhiệm vụ khó khăn hơn, chẳng hạn như tạo gói phần mềm, cài đặt phần mềm hoặc sao lưu máy chủ tệp.

1. Câu lệnh điều kiện

Cũng như với rất nhiều ngôn ngữ lập trình khác, điều kiện là một tính năng phổ biến và mạnh mẽ. Một điều kiện là những gì cho phép logic được thực hiện bởi một chương trình máy tính. Hầu hết các ví dụ của tôi đều dựa trên logic có điều kiện.

Câu điều kiện cơ bản sử dụng câu lệnh "if". Điều này cho phép chúng tôi kiểm tra một số điều kiện mà sau đó chúng tôi có thể sử dụng để thao tác cách một tập lệnh thực hiện. Ví dụ, chúng ta có thể kiểm tra sự tồn tại của thư mục bin Java, thư mục này cho biết rằng Java đã được cài đặt. Nếu được tìm thấy, đường dẫn thực thi có thể được cập nhật cùng với vị trí để kích hoạt các cuộc gọi bằng các ứng dụng Java.

if [ -d "$JAVA_HOME/bin" ] ; then
    PATH="$JAVA_HOME/bin:$PATH"

2. Giới hạn thực thi

Bạn có thể muốn giới hạn một tập lệnh chỉ được chạy bởi một người dùng cụ thể. Mặc dù Linux có các quyền tiêu chuẩn cho người dùng và nhóm, cũng như SELinux để kích hoạt loại bảo vệ này, bạn có thể chọn đặt logic trong một tập lệnh. Có lẽ bạn muốn chắc chắn rằng chỉ chủ sở hữu của một ứng dụng web cụ thể mới có thể chạy tập lệnh khởi động của nó. Bạn thậm chí có thể sử dụng mã để giới hạn một tập lệnh cho người dùng gốc. Linux có một số biến môi trường mà chúng ta có thể kiểm tra theo logic này. Một là $ USER , cung cấp tên người dùng. Một cái khác là $ UID , cung cấp số nhận dạng của người dùng (UID) và trong trường hợp là tập lệnh, là UID của người dùng đang thực thi.

Người dùng

Ví dụ đầu tiên cho thấy cách tôi có thể giới hạn một tập lệnh cho người dùng jboss1 trong môi trường đa lưu trữ với một số phiên bản máy chủ ứng dụng. Về cơ bản, câu lệnh có điều kiện "if" hỏi, "Người dùng đang thực thi có phải là jboss1 không?" Khi điều kiện được tìm thấy là đúng, câu lệnh echo đầu tiên được gọi, theo sau là lối ra 1, kết thúc tập lệnh.

if [ "$USER" != 'jboss1' ]; then
     echo "Sorry, this script must be run as JBOSS1!"
     exit 1
fi
echo "continue script"

Gốc

Tập lệnh ví dụ tiếp theo này đảm bảo rằng chỉ người dùng root mới có thể thực thi nó. Vì UID cho gốc là 0, chúng tôi có thể sử dụng -gt trong câu lệnh if có điều kiện để cấm tất cả các UID lớn hơn 0.

if [ "$UID" -gt 0 ]; then
     echo "Sorry, this script must be run as ROOT!"
     exit 1
fi
echo "continue script"

3. Sử dụng các đối số

Cũng giống như bất kỳ chương trình thực thi nào, các tập lệnh Bash có thể lấy các đối số làm đầu vào. Dưới đây là một vài ví dụ. Nhưng trước tiên, bạn nên hiểu rằng lập trình tốt có nghĩa là chúng tôi không chỉ viết các ứng dụng làm những gì chúng tôi muốn; chúng ta phải viết các ứng dụng không thể làm những gì chúng tôi không muốn. Tôi muốn đảm bảo rằng một tập lệnh không làm bất cứ điều gì phá hoại trong trường hợp không có tranh cãi. Do đó, đây là lần kiểm tra đầu tiên mà y. Điều kiện kiểm tra số lượng đối số, $ # , cho giá trị bằng 0 và kết thúc tập lệnh nếu đúng.

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi
echo "arguments found: $#"

Nhiều đối số

Bạn có thể chuyển nhiều đối số vào một tập lệnh. Các biến nội bộ mà tập lệnh sử dụng để tham chiếu đến từng đối số được tăng dần lên, chẳng hạn như $ 1 , 2 đô la , 3 đô la , và như thế. Tôi sẽ chỉ mở rộng ví dụ của mình ở trên với dòng sau để lặp lại ba đối số đầu tiên. Rõ ràng, sẽ cần thêm logic để xử lý đối số thích hợp dựa trên tổng số. Ví dụ này đơn giản để minh họa.

echo $1 $2 $3

Trong khi chúng ta đang thảo luận về các biến đối số này, bạn có thể tự hỏi, "Anh ta có bỏ qua số 0 không?"

Vâng, vâng, tôi đã làm, nhưng tôi có một lý do tuyệt vời! Thực sự có $ 0 và nó rất hữu ích. Giá trị của nó chỉ đơn giản là tên của tập lệnh đang được thực thi.

echo $0

Một lý do quan trọng để tham chiếu đến tên của tập lệnh trong quá trình thực thi là tạo tệp nhật ký bao gồm tên của tập lệnh trong tên riêng của nó. Dạng đơn giản nhất có thể chỉ là một câu lệnh echo.

echo test >> $0.log

Tuy nhiên, có thể bạn sẽ muốn thêm một đoạn mã nữa để đảm bảo rằng nhật ký được ghi vào một vị trí có tên và thông tin mà bạn thấy hữu ích cho trường hợp sử dụng của mình.

4. Đầu vào của người dùng

Một tính năng hữu ích khác để sử dụng trong tập lệnh là khả năng chấp nhận đầu vào trong quá trình thực thi. Đơn giản nhất là cung cấp cho người dùng một số thông tin đầu vào.

echo "enter a word please:"
 read word
 echo $word

Điều này cũng cho phép bạn cung cấp các lựa chọn cho người dùng.

read -p "Install Software ?? [Y/n]: " answ
 if [ "$answ" == 'n' ]; then
   exit 1
 fi
   echo "Installation starting..."

5. Thoát khi thất bại

Vài năm trước, tôi đã viết một kịch bản để cài đặt phiên bản mới nhất của Bộ phát triển Java (JDK) trên máy tính của mình. Tập lệnh trích xuất kho lưu trữ JDK vào một thư mục cụ thể, cập nhật một liên kết tượng trưng và sử dụng tiện ích thay thế để làm cho hệ thống biết về phiên bản mới. Nếu việc trích xuất kho lưu trữ JDK không thành công, việc tiếp tục có thể phá vỡ toàn bộ hệ thống Java. Vì vậy, tôi muốn kịch bản bị hủy bỏ trong tình huống như vậy. Tôi không muốn tập lệnh thực hiện loạt thay đổi hệ thống tiếp theo trừ khi bản lưu trữ được trích xuất thành công. Sau đây là một đoạn trích từ tập lệnh đó:

tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
     echo "Installation failed - exiting."
     exit 1
fi

Một cách nhanh chóng để bạn chứng minh việc sử dụng $? biến với một dòng chữ ngắn này:

ls T; ec=$?; echo $ec

Đầu tiên, chạy chạm T tiếp theo là lệnh này. Giá trị của ec sẽ là 0. Sau đó, xóa T , rm T và lặp lại lệnh. Giá trị của ec bây giờ sẽ là 2 vì ls báo cáo tình trạng lỗi kể từ T không được tìm thấy.

Bạn có thể tận dụng báo cáo lỗi này để bao gồm logic, như tôi đã nêu ở trên, để kiểm soát hành vi của các tập lệnh của bạn.

Takeaway

Chúng tôi có thể cho rằng chúng tôi cần sử dụng các ngôn ngữ, chẳng hạn như Python, C hoặc Java, để có chức năng cao hơn, nhưng điều đó không nhất thiết phải đúng. Ngôn ngữ kịch bản Bash rất mạnh mẽ. Có rất nhiều điều phải học để tối đa hóa tính hữu ích của nó. Tôi hy vọng một vài ví dụ này sẽ làm sáng tỏ tiềm năng của việc mã hóa bằng Bash.