Với các tập lệnh bash, bạn có thể chạy các chuỗi lệnh. Chúng ngăn bạn lặp lại chính mình và cho phép bạn lưu trữ các lệnh dài và tẻ nhạt để nhập để sử dụng sau này. Trong bài viết này, bạn sẽ tìm hiểu cách tạo tập lệnh Bash. Bạn cũng sẽ học cách đọc đối số, sử dụng biến và tạo vòng lặp for để lặp lại hành động
Trước khi bạn bắt đầu tạo tập lệnh, hãy đảm bảo rằng bạn đã quen thuộc với các lệnh cơ bản của Linux
Mục lục
Tạo tập lệnh Bash
Tập lệnh dòng lệnh bắt đầu bằng shebang — một chuỗi gồm hai ký tự #!/bin/bash8. Sau hai ký tự này, bạn có thể đặt tên cho bất kỳ trình thông dịch nào và một loạt các đối số, như thế này
#!interpreter [optional arguments]Tập lệnh trình bao thường dựa trên trình bao phổ biến nhất được gọi là Bash, vì vậy điều này đơn giản sẽ trở thành
#!/bin/bashĐôi khi bạn sẽ thấy điều này thay vì
#!/usr/bin/env bashKhi sử dụng #!/bin/bash9, lệnh được cung cấp sẽ được tìm kiếm trong #!/usr/bin/env bash0 hiện tại, thay vì mã hóa cứng nó vào vị trí #!/usr/bin/env bash1. Bash hầu như sẽ luôn được tìm thấy tại #!/usr/bin/env bash1, vì vậy phương pháp đầu tiên phù hợp với chúng tôi
Tuy nhiên, bạn có thể muốn sử dụng thủ thuật này để tạo tập lệnh Python có thể thực thi được. Python có thể được cài đặt ở bất cứ đâu, tùy thuộc vào cách cài đặt. Tôi đã xem nó trong #!/usr/bin/env bash3, #!/usr/bin/env bash4, và #!/usr/bin/env bash5, chỉ kể tên một số. Nếu bạn đang chạy một môi trường ảo, nó có thể ở bất cứ đâu. Vì vậy, tìm kiếm #!/usr/bin/env bash0 là một lựa chọn tốt, vì điều đó sẽ tìm thấy phiên bản Python từ môi trường ảo
Chúng ta sẽ bắt đầu tạo một tập lệnh shell thực tế trong giây lát. Nhưng trước tiên, chúng ta sẽ xem xét các biến và vòng lặp for để cải thiện một chút
biến bash
Cũng giống như các ngôn ngữ khác, Bash có các biến. Một điều đặc biệt về các biến trong Bash là bạn truy cập chúng bằng ký hiệu đô la, nhưng bạn đặt chúng mà không có nó. Để làm rõ, đây là một ví dụ
myvar="Hello world" echo $myvarBash có một số biến dành riêng, được đặt tự động cho bạn. Bảng sau đây là danh sách không đầy đủ của một số bảng hữu ích hơn
VariableFunction$0Tên của tập lệnh hiện tại. $1 … $99 Đối số đầu tiên cho tập lệnh. $#Số đối số được chuyển đến tập lệnh. $@Tất cả các đối số được cung cấp cho tập lệnh. $USERTên người dùng của người dùng đang chạy tập lệnh. $HOSTNAMETên máy chủ của máy mà tập lệnh đang chạy trên đó. $SECONDSSố giây kể từ khi tập lệnh được bắt đầu. $RANDOM Trả về một số ngẫu nhiên khác nhau mỗi khi nó được nhắc đến. $LINENOTrả về số dòng hiện tại trong tập lệnh Bash. Biến dành riêng cho BashĐối số Bash Script
Bây giờ chúng tôi có thể tạo tập lệnh shell, nhưng tập lệnh này sẽ thực hiện công việc tương tự mỗi khi bạn chạy nó. Chúng ta có thể làm cho nó thú vị hơn vô cùng bằng cách sử dụng các đối số
Đây là một ví dụ, hãy gọi nó là #!/usr/bin/env bash7
#!/bin/bash echo "Hello $1, from $0"Nếu chúng ta chạy cái này với một đối số, kết quả như sau
$ ./arguments.sh Weirdo Hello Weirdo, from ./arguments.shNhững gì Bash làm là cắt nhỏ toàn bộ lệnh của bạn và gán nó cho các biến không mấy giàu trí tưởng tượng #!/usr/bin/env bash8, #!/usr/bin/env bash9, myvar="Hello world" echo $myvar0, v.v. Như bạn có thể thấy, phần đầu tiên của lệnh của chúng tôi là tên của chính tập lệnh. Điều này có thể hữu ích, như có thể thấy trong phần tiếp theo
Tạo một mạng lưới an toàn
Trước khi chuyển sang nội dung nghiêm túc, tôi muốn dạy bạn về một mạng lưới an toàn quan trọng
Khi bạn bắt đầu tạo kịch bản, bạn sẽ không tránh khỏi sai sót. Tất cả chúng ta làm. Một lỗi rất phổ biến trong kịch bản có thể đặc biệt tai hại. Đó là biến không được đặt. Nếu bạn không hiểu ý tôi, hãy tiếp tục đọc vì nó sẽ trở nên rõ ràng trong giây lát
Chúng tôi có thể ngăn việc sử dụng các biến chưa đặt bằng cách bắt đầu tập lệnh của mình bằng lệnh sau
set -uĐó là tất cả. Từ đây trở đi, tập lệnh của bạn sẽ xử lý các biến chưa đặt là lỗi khi bạn thay thế
Ví dụ: tập lệnh này sẽ thất bại
#!/bin/bash set -u rm -rf /$my_directoryĐầu ra
$ ./test.sh ./test.sh: 3: ./test.sh: my_directory: parameter not setĐó là bởi vì tôi chưa bao giờ đặt myvar="Hello world" echo $myvar1. Nếu không có myvar="Hello world" echo $myvar2, nó sẽ không thất bại mà thay vào đó, chỉ cần bỏ qua biến trống, để lại cho chúng tôi lệnh myvar="Hello world" echo $myvar3. Tất cả chúng ta đều biết điều đó làm gì, phải không?
Tạo thói quen luôn bắt đầu tập lệnh của bạn bằng myvar="Hello world" echo $myvar2
Bash cho vòng lặp
Tính hữu ích của dòng lệnh và đặc biệt là các tập lệnh sẽ tăng theo cấp số nhân khi bạn thành thạo các vòng lặp Bash. Và mặc dù chúng trông có vẻ đáng sợ, nhưng chúng thực sự không khó đến thế
Cú pháp của vòng lặp Bash for-loop
Cú pháp cơ bản của một vòng lặp là
for VARIABLE in A LIST do command1 command2 commandN doneVí dụ tập lệnh Bash
Phần myvar="Hello world" echo $myvar6 có thể là bất cứ thứ gì. tên tệp, số hoặc chuỗi. Tuy nhiên, nó sẽ là một danh sách các tên tệp trong hầu hết các tập lệnh, vì đó là những gì chúng tôi thường làm việc với Bash. Bây giờ chúng ta đã biết cách tạo một vòng lặp, hãy xem tập lệnh đầu tiên của chúng ta
#!/bin/bash0Trong vòng lặp for cuối cùng, tôi đã sử dụng biểu thức myvar="Hello world" echo $myvar7. Điều này thực thi lệnh giữa các dấu ngoặc đơn và thay thế kết quả. Trong trường hợp này, myvar="Hello world" echo $myvar8 được thực thi và vòng lặp for được cung cấp các tên tệp mà _______12_______8 được in ra
Bắt đầu một tập lệnh Bash
Để bắt đầu tập lệnh này, chúng ta có thể làm hai việc. Đầu tiên, chúng ta có thể chạy nó với
#!/bin/bash1Cách thứ hai mà tôi khuyên dùng là làm cho tệp có thể thực thi được. Hệ điều hành sẽ biết cách thực thi tệp của chúng tôi vì dòng shebang của chúng tôi ở trên cùng. Làm cho tệp có thể thực thi được thực hiện bằng cách đặt "cờ thực thi" của tệp như thế này
#!/bin/bash2Bây giờ bạn có thể chạy tập lệnh với
#!/bin/bash3Đầu ra trong trường hợp của tôi là
#!/bin/bash4Nó có thể khác đối với bạn, tùy thuộc vào tệp nào trong thư mục mà bạn đang chạy tập lệnh trong đó
Bash lập trình có điều kiện
Đôi khi bạn chỉ muốn chạy một lệnh nếu một điều kiện nào đó là đúng. Đối với điều này, chúng ta có cấu trúc #!/bin/bash echo "Hello $1, from $0"0 trong bash
Kiểm tra các đối số trong tập lệnh bash
Chúng ta có thể sử dụng lập trình có điều kiện để cải thiện ví dụ trước của mình, #!/usr/bin/env bash7, vì nó có một vấn đề nhỏ. Nó mong đợi một cái tên trong #!/usr/bin/env bash9 mà không cần kiểm tra xem nó có thực sự có một cái tên hay không. Hãy khắc phục điều này
Kiểm tra các đối số trong tập lệnh Bash của bạnNếu điều đó không hiệu quả, đây là phiên bản tĩnh của cùng một mã
#!/bin/bash5Lệnh kiểm tra trong bash
Với #!/bin/bash echo "Hello $1, from $0"3 chúng ta có thể kiểm tra xem độ dài của một biến có bằng 0 không. Nếu đúng như vậy, chúng tôi in một số hướng dẫn sử dụng thân thiện
#!/bin/bash6Lệnh test có thể kiểm tra nhiều thứ nên nó thực sự hỗ trợ trong lập trình có điều kiện. Danh sách đầy đủ có thể được nhìn thấy khi bạn nhập #!/bin/bash echo "Hello $1, from $0"4 trên dòng lệnh. Đúng vậy, bạn không cần Google cho mọi thứ. Sử dụng các trang hướng dẫn là một phần của việc trở thành ninja dòng lệnh. Bạn sẽ thấy rằng có một trang hướng dẫn dành cho hầu hết mọi thứ bạn có thể làm trong thiết bị đầu cuối của mình. Xét cho cùng, ngày xưa, chúng ta không có Internet để google mọi thứ…
Đây là một ví dụ nữa trong đó chúng ta so sánh hai giá trị để xem chúng có giống nhau không
So sánh hai giá trị trong BashĐây là phiên bản tĩnh trong trường hợp không hoạt động
#!/bin/bash7Vòng lặp này chạy trong 10 lần lặp lại và mỗi lần kiểm tra xem #!/bin/bash echo "Hello $1, from $0"5 có bằng 3 không. Bạn có thể dự đoán đầu ra?