Hướng dẫn dành cho người mới bắt đầu về Shell Scripting: Khái niệm cơ bản
Thuật ngữ "shell scripting" thường được đề cập trong các diễn đàn Linux, nhưng nhiều người dùng không quen thuộc với nó. Học phương pháp lập trình dễ dàng và mạnh mẽ này có thể giúp bạn tiết kiệm thời gian, học dòng lệnh tốt hơn và loại bỏ các tác vụ quản lý tệp tẻ nhạt.
Shell Scripting là gì?
Là một người dùng Linux có nghĩa là bạn chơi xung quanh với dòng lệnh. Dù muốn hay không, chỉ có một số thứ được thực hiện dễ dàng hơn nhiều thông qua giao diện này hơn là bằng cách trỏ và nhấp. Bạn càng sử dụng và tìm hiểu dòng lệnh, bạn càng thấy tiềm năng của nó. Chà, bản thân dòng lệnh là một chương trình: shell. Hầu hết các bản phân phối Linux ngày nay đều sử dụng Bash và đây là những gì bạn thực sự đang nhập lệnh.
Bây giờ, một số bạn đã sử dụng Windows trước khi sử dụng Linux có thể nhớ các tệp hàng loạt. Đây là những tệp văn bản nhỏ mà bạn có thể điền vào các lệnh để thực thi và Windows sẽ chạy chúng lần lượt. Đó là một cách thông minh và gọn gàng để hoàn thành một số việc, chẳng hạn như chạy trò chơi trong phòng máy tính ở trường trung học của bạn khi bạn không thể mở thư mục hệ thống hoặc tạo lối tắt. Các tệp hàng loạt trong Windows, mặc dù hữu ích, nhưng lại là một sự bắt chước rẻ tiền của các tập lệnh shell.
Các tập lệnh Shell cho phép chúng ta lập trình các lệnh trong chuỗi và để hệ thống thực thi chúng như một sự kiện được viết theo tập lệnh, giống như các tệp hàng loạt. Chúng cũng cho phép các chức năng hữu ích hơn nhiều, chẳng hạn như thay thế lệnh. Bạn có thể gọi một lệnh, chẳng hạn như ngày tháng và sử dụng đầu ra của lệnh đó như một phần của lược đồ đặt tên tệp. Bạn có thể tự động hóa các bản sao lưu và mỗi tệp được sao chép có thể có ngày hiện tại được thêm vào cuối tên của nó. Tập lệnh không chỉ là lời gọi các lệnh. Chúng là các chương trình theo đúng nghĩa của chúng. Tập lệnh cho phép bạn sử dụng các chức năng lập trình - chẳng hạn như vòng lặp ‘for’, câu lệnh if / then / else, v.v. - ngay trong giao diện hệ điều hành của bạn. Và, bạn không cần phải học một ngôn ngữ khác bởi vì bạn đang sử dụng những gì bạn đã biết: dòng lệnh.
Tôi nghĩ đó thực sự là sức mạnh của việc viết kịch bản. Bạn có thể lập trình với các lệnh mà bạn đã biết, trong khi học những thứ cơ bản của hầu hết các ngôn ngữ lập trình chính. Bạn cần làm điều gì đó lặp đi lặp lại và tẻ nhạt? Viết kịch bản cho nó! Cần một phím tắt cho một lệnh thực sự phức tạp? Viết kịch bản cho nó! Bạn muốn xây dựng một giao diện dòng lệnh thực sự dễ sử dụng cho một thứ gì đó? Viết kịch bản cho nó!
Trước khi bắt đầu
Trước khi chúng ta bắt đầu loạt bài viết về kịch bản, hãy cùng tìm hiểu một số thông tin cơ bản. Chúng tôi sẽ sử dụng bash shell mà hầu hết các bản phân phối Linux đều sử dụng nguyên bản. Bash có sẵn cho người dùng Mac OS và Cygwin trên Windows. Vì nó rất phổ biến, bạn sẽ có thể viết kịch bản bất kể nền tảng của bạn. Ngoài ra, miễn là tất cả các lệnh được tham chiếu còn tồn tại, các tập lệnh có thể hoạt động trên nhiều nền tảng mà không cần hoặc không cần điều chỉnh.
Tập lệnh có thể dễ dàng tận dụng các đặc quyền của “quản trị viên” hoặc “người dùng cấp cao”, vì vậy tốt nhất là bạn nên thử nghiệm các tập lệnh trước khi đưa chúng vào hoạt động. Cũng sử dụng cách hiểu thông thường, chẳng hạn như đảm bảo rằng bạn có bản sao lưu của các tệp mà bạn sắp chạy tập lệnh. Điều thực sự quan trọng là sử dụng các tùy chọn phù hợp, chẳng hạn như –i cho lệnh rm, để bạn cần có sự tương tác. Điều này có thể ngăn ngừa một số sai lầm khó chịu. Do đó, hãy đọc kỹ các tập lệnh bạn tải xuống và cẩn thận với dữ liệu bạn có, đề phòng trường hợp xảy ra sự cố.
Về cốt lõi của chúng, các tập lệnh chỉ là các tệp văn bản thuần túy. Bạn có thể sử dụng bất kỳ trình soạn thảo văn bản nào để viết chúng: gedit, emacs, vim, nano… Danh sách này vẫn tiếp tục. Chỉ cần đảm bảo lưu nó dưới dạng văn bản thuần túy, không phải dưới dạng văn bản đa dạng thức hoặc tài liệu Word. Vì tôi thích sự dễ sử dụng mà nano mang lại, tôi sẽ sử dụng nó.
Quyền và tên tập lệnh
Các tập lệnh được thực thi giống như các chương trình và để điều này xảy ra, chúng cần có các quyền thích hợp. Bạn có thể thực thi các tập lệnh bằng cách chạy lệnh sau trên đó:
chmod + x ~ / somecrazyfolder / script
Điều này sẽ cho phép bất kỳ ai chạy tập lệnh cụ thể đó. Nếu bạn muốn giới hạn việc sử dụng nó cho chỉ người dùng của mình, bạn có thể sử dụng nó để thay thế:
chmod u + x ~ / somecrazyfolder / script
Để chạy tập lệnh này, bạn sẽ phải cd vào thư mục thích hợp và sau đó chạy tập lệnh như sau:
cd ~ / somecrazyfolder
./script1
Để làm cho mọi thứ thuận tiện hơn, bạn có thể đặt các tập lệnh vào thư mục “bin” trong thư mục chính của mình:
~ / bin
Trong nhiều bản phân phối hiện đại, thư mục này không còn được tạo theo mặc định nữa, nhưng bạn có thể tạo nó. Đây thường là nơi các tệp thực thi được lưu trữ thuộc về người dùng của bạn chứ không phải của người dùng khác. Bằng cách đặt các tập lệnh ở đây, bạn chỉ có thể chạy chúng bằng cách nhập tên của chúng, giống như các lệnh khác, thay vì phải cd xung quanh và sử dụng tiền tố ‘./’.
Tuy nhiên, trước khi đặt tên cho tập lệnh, bạn nên dùng lệnh sau để kiểm tra xem bạn đã cài đặt chương trình sử dụng tên đó chưa:
[lệnh] nào
Rất nhiều người đặt tên cho các tập lệnh ban đầu của họ là “thử nghiệm” và khi họ cố gắng chạy nó trong dòng lệnh, không có gì xảy ra. Điều này là do nó xung đột với lệnh kiểm tra, lệnh này không hoạt động gì nếu không có đối số. Luôn đảm bảo rằng tên tập lệnh của bạn không xung đột với các lệnh, nếu không, bạn có thể thấy mình đang làm những việc bạn không định làm!
Nguyên tắc viết kịch bản
Như tôi đã đề cập trước đây, mọi tệp script về cơ bản là văn bản thuần túy. Tuy nhiên, điều đó không có nghĩa là bạn có thể viết tất cả những gì bạn muốn. Khi một tệp văn bản được cố gắng thực thi, các trình bao sẽ phân tích cú pháp qua chúng để tìm manh mối về việc chúng có phải là tập lệnh hay không và cách xử lý mọi thứ đúng cách. Do đó, có một số hướng dẫn bạn cần biết.
- Mọi tập lệnh phải có “#! / Bin / bash”
- Mỗi dòng mới là một lệnh mới
- Các dòng nhận xét bắt đầu bằng dấu #
- Các lệnh được bao quanh bởi ()
Hash-Bang Hack
Khi một trình bao phân tích cú pháp qua tệp văn bản, cách trực tiếp nhất để xác định tệp dưới dạng tập lệnh là tạo dòng đầu tiên của bạn:
#! / bin / bash
Nếu bạn sử dụng một trình bao khác, hãy thay thế đường dẫn của nó tại đây. Các dòng nhận xét bắt đầu bằng dấu thăng (#), nhưng việc thêm tiếng nổ (!) Và đường dẫn shell sau nó là một kiểu hack sẽ bỏ qua quy tắc nhận xét này và sẽ buộc tập lệnh thực thi với shell mà dòng này trỏ tới.
Dòng mới = Lệnh mới
Mỗi dòng mới nên được coi là một lệnh mới, hoặc một thành phần của một hệ thống lớn hơn. Ví dụ, các câu lệnh if / then / else sẽ chiếm nhiều dòng, nhưng mỗi thành phần của hệ thống đó nằm trong một dòng mới. Đừng để lệnh tràn sang dòng tiếp theo, vì điều này có thể cắt ngắn lệnh trước đó và gây ra lỗi cho bạn ở dòng tiếp theo. Nếu trình soạn thảo văn bản của bạn đang làm điều đó, bạn nên tắt tính năng gói văn bản để an toàn. Bạn có thể tắt gói văn bản trong nano bit nhấn ALT + L.
Thường xuyên nhận xét bằng #s
Nếu bạn bắt đầu một dòng bằng dấu #, dòng đó sẽ bị bỏ qua. Điều này biến nó thành một dòng chú thích, nơi bạn có thể tự nhắc nhở mình về kết quả đầu ra của lệnh trước đó là gì hoặc lệnh tiếp theo sẽ làm gì. Một lần nữa, hãy tắt gói văn bản hoặc ngắt nhận xét của bạn thành nhiều dòng mà tất cả đều bắt đầu bằng dấu thăng. Sử dụng nhiều bình luận là một phương pháp hay, vì nó cho phép bạn và những người khác chỉnh sửa tập lệnh của bạn dễ dàng hơn. Ngoại lệ duy nhất là hack Hash-Bang nói trên, vì vậy đừng làm theo #s với! S. ;-)
Các lệnh được bao quanh bởi dấu ngoặc đơn
Ngày xưa, việc thay thế lệnh được thực hiện bằng các dấu tích duy nhất (`, chia sẻ phím ~). Chúng tôi sẽ không đề cập đến vấn đề này, nhưng khi hầu hết mọi người bắt đầu và khám phá sau khi tìm hiểu các kiến thức cơ bản, có lẽ bạn nên sử dụng dấu ngoặc đơn để thay thế. Điều này chủ yếu là do khi bạn lồng - đặt các lệnh bên trong các lệnh khác - dấu ngoặc đơn hoạt động tốt hơn.
Tập lệnh đầu tiên của bạn
Hãy bắt đầu với một tập lệnh đơn giản cho phép bạn sao chép tệp và thêm ngày vào cuối tên tệp. Hãy gọi nó là “datecp”. Trước tiên, hãy kiểm tra xem tên đó có xung đột với điều gì đó không:
Bạn có thể thấy rằng không có đầu ra của lệnh nào, vì vậy chúng tôi đã sẵn sàng sử dụng tên này.
Hãy tạo một tệp trống trong thư mục ~ / bin:
chạm vào ~ / bin / datecp
Và, hãy thay đổi quyền ngay bây giờ, trước khi chúng ta quên:
Sau đó, hãy bắt đầu xây dựng kịch bản của chúng ta. Mở tệp đó trong trình soạn thảo văn bản mà bạn chọn. Như tôi đã nói, tôi thích sự đơn giản của nano.
nano ~ / bin / datecp
Và, hãy tiếp tục và đưa vào dòng đầu tiên điều kiện tiên quyết và nhận xét về những gì tập lệnh này thực hiện.
Tiếp theo, hãy khai báo một biến. Nếu bạn đã từng học đại số, bạn có thể biết đó là gì. Một biến cho phép chúng ta lưu trữ thông tin và thực hiện mọi việc với nó. Các biến có thể "mở rộng" khi được tham chiếu ở nơi khác. Tức là, thay vì hiển thị tên của họ, họ sẽ hiển thị nội dung được lưu trữ của họ. Sau đó, bạn có thể yêu cầu cùng một biến đó lưu trữ thông tin khác nhau và bất kỳ lệnh nào xảy ra sau đó sẽ sử dụng thông tin mới. Đó là một trình giữ chỗ thực sự thú vị.
Chúng ta sẽ đưa gì vào biến? Vâng, hãy lưu trữ ngày và giờ! Để làm điều này, chúng tôi sẽ gọi lệnh ngày.
Hãy xem ảnh chụp màn hình bên dưới để biết cách tạo đầu ra của lệnh date:
Bạn có thể thấy rằng bằng cách thêm các biến khác nhau bắt đầu bằng%, bạn có thể thay đổi đầu ra của lệnh thành những gì bạn muốn. Để biết thêm thông tin, bạn có thể xem trang hướng dẫn sử dụng lệnh ngày.
Hãy sử dụng lần lặp cuối cùng của lệnh ngày, “date +% m_% d_% y-% H.% M.% S” và sử dụng lệnh đó trong tập lệnh của chúng tôi.
Nếu chúng tôi lưu tập lệnh này ngay bây giờ, chúng tôi có thể chạy nó và nó sẽ cung cấp cho chúng tôi đầu ra của lệnh ngày như chúng tôi mong đợi:
Nhưng, hãy làm điều gì đó khác biệt. Hãy đặt một tên biến, như date_formatted cho lệnh này. Cú pháp thích hợp cho điều này như sau:
biến = $ (đối số lệnh –options)
Và đối với chúng tôi, chúng tôi sẽ xây dựng nó như thế này:
date_formatted = $ (ngày +% m_% d_% y-% H.% M.% S)
Đây là những gì chúng tôi gọi là thay thế lệnh. Về cơ bản, chúng tôi đang nói với bash rằng bất cứ khi nào biến “date_formatted” hiển thị, hãy chạy lệnh bên trong dấu ngoặc đơn. Sau đó, bất kỳ đầu ra nào mà các lệnh cung cấp sẽ được hiển thị thay vì tên của biến, “date_formatted”.
Dưới đây là một tập lệnh mẫu và đầu ra của nó:
Lưu ý rằng có hai khoảng trắng trong đầu ra. Khoảng trắng trong dấu ngoặc kép của lệnh echo và khoảng trắng phía trước biến đều được hiển thị. Không sử dụng dấu cách nếu bạn không muốn chúng hiển thị. Cũng lưu ý rằng nếu không có dòng “echo” được thêm vào này, tập lệnh sẽ hoàn toàn không có đầu ra.
Hãy quay lại kịch bản của chúng ta. Tiếp theo hãy thêm phần sao chép của lệnh.
cp –iv $ 1 $ 2. $ date_formatted
Thao tác này sẽ gọi lệnh sao chép, với các tùy chọn –i và –v. Cái trước sẽ yêu cầu bạn xác minh trước khi ghi đè tệp và cái sau sẽ hiển thị những gì đang xảy ra trên dòng lệnh.
Tiếp theo, bạn có thể thấy Tôi đã thêm tùy chọn “$ 1”. Khi viết tập lệnh, một dấu đô la ($) theo sau là một số sẽ biểu thị đối số được đánh số của tập lệnh khi nó được gọi. Ví dụ, trong lệnh sau:
cp –iv Trogdor2.mp3 ringtone.mp3
Đối số đầu tiên là “Trogdor2.mp3” và đối số thứ hai là “ringtone.mp3”.
Nhìn lại tập lệnh của mình, chúng ta có thể thấy rằng chúng ta đang tham chiếu đến hai đối số:
Điều này có nghĩa là khi chúng tôi chạy tập lệnh, chúng tôi sẽ cần cung cấp hai đối số để tập lệnh chạy chính xác. Đối số đầu tiên, $ 1, là tệp sẽ được sao chép và được thay thế làm đối số đầu tiên của lệnh “cp –iv”.
Đối số thứ hai, $ 2, sẽ hoạt động như tệp đầu ra cho cùng một lệnh. Tuy nhiên, bạn cũng có thể thấy rằng nó khác. Chúng tôi đã thêm một khoảng thời gian và chúng tôi đã tham chiếu biến “date_formatted” ở trên. Tò mò không biết điều này làm gì?
Đây là những gì sẽ xảy ra khi tập lệnh được chạy:
Bạn có thể thấy rằng tệp đầu ra được liệt kê dưới dạng bất kỳ thứ gì tôi đã nhập với giá 2 đô la, theo sau là dấu chấm, sau đó là đầu ra của lệnh ngày! Có lý, phải không?
Bây giờ khi tôi chạy lệnh datecp, nó sẽ chạy tập lệnh này và cho phép tôi sao chép bất kỳ tệp nào vào một vị trí mới, đồng thời tự động thêm ngày và giờ vào cuối tên tệp. Hữu ích để lưu trữ nội dung!
Tập lệnh Shell là trọng tâm của việc làm cho hệ điều hành của bạn hoạt động cho bạn. Bạn cũng không cần phải học một ngôn ngữ lập trình mới để biến điều đó thành hiện thực. Hãy thử viết kịch bản với một số lệnh cơ bản tại nhà và bắt đầu nghĩ xem bạn có thể sử dụng lệnh này để làm gì.
Bạn có viết kịch bản không? Có lời khuyên nào cho người mới không? Chia sẻ suy nghĩ của bạn trong các ý kiến! Còn nhiều thứ nữa trong loạt phim này!