Trang chủ » làm thế nào để » Hướng dẫn cho người mới bắt đầu về Shell Scripting 2 cho các vòng lặp

    Hướng dẫn cho người mới bắt đầu về Shell Scripting 2 cho các vòng lặp

    Nếu bạn muốn xây dựng uy tín của mình, hãy tham gia với chúng tôi cho phần thứ hai trong loạt kịch bản shell của chúng tôi. Chúng tôi có một vài chỉnh sửa, một vài cải tiến cho kịch bản của tuần trước và hướng dẫn về cách lặp cho người không quen.

    Tập lệnh datecp được xem lại

    Trong phần đầu tiên của hướng dẫn kịch bản shell của chúng tôi, chúng tôi đã tạo một tập lệnh sao chép tệp vào thư mục sao lưu sau khi nối ngày vào cuối tên tệp.

    Samuel Dionne-Riel đã chỉ ra trong các ý kiến ​​rằng có một cách tốt hơn nhiều để xử lý các tham chiếu biến của chúng tôi.

    Các đối số được phân tách bằng dấu cách trong shell bash, nó sẽ token hóa khi có một khoảng trắng trong lệnh mở rộng kết quả. Trong kịch bản của bạn, cp $ 1 $ 2. $ date_formatted sẽ hoạt động như dự định miễn là các biến mở rộng không có khoảng trắng trong chúng. Nếu bạn gọi kịch bản của bạn theo cách này: datecp "tên cũ của tôi" "tên mới của tôi" việc mở rộng sẽ dẫn đến lệnh này: cp tên mới của tôi tên cũ của tôi.the_date trong đó thực sự có 6 đối số.

    Để giải quyết chính xác vấn đề này, dòng cuối cùng của tập lệnh phải là: cp "$ 1" "$ 2. $ date_formatted"

    Như bạn có thể thấy, thay đổi dòng tập lệnh của chúng tôi từ:

    cp -iv $ 1 $ 2. $ date_formatted

    đến:

    cp -iv phiên bản $ 1 Đăng nhập $ 2 người. $ date_formatted

    sẽ xử lý vấn đề này khi sử dụng tập lệnh trên các tệp có khoảng trắng trong tên. Samuel cũng đưa ra quan điểm rằng khi sao chép và dán mã từ trang web này (hoặc nói chung là internet), hãy chắc chắn thay thế dấu gạch ngang và dấu ngoặc kép phù hợp cho những người giỏi hơn về mặt chữ viết chữ thường hay thay thế chúng. Chúng tôi cũng sẽ làm nhiều hơn để đảm bảo mã của chúng tôi thân thiện hơn với sao chép / dán. ;-)

    Một người bình luận khác, Myles Braithwaite, đã quyết định mở rộng tập lệnh của chúng tôi để ngày sẽ xuất hiện trước phần mở rộng tập tin. Vì vậy, thay vì

    ngonfile.mp3.07_14_11-12.34.56

    chúng ta sẽ có được điều này:

    ngonfile.07_14_11-12.34.56.mp3

    mà cuối cùng thuận tiện hơn một chút cho hầu hết người dùng. Mã của anh ấy có sẵn trên trang GitHub của anh ấy. Chúng ta hãy xem những gì anh ta sử dụng để tách tên tập tin.

    date_formatted = $ (ngày +% Y-% m-% d_% H.% M% S)
    file_extension = $ (echo Hồi $ 1 "| awk -F. 'print $ NF')
    file_name = $ (tên cơ sở $ 1. $ file_extension)

    cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension

    Tôi đã thay đổi định dạng một chút, nhưng bạn có thể thấy rằng Myles khai báo hàm ngày tháng của mình trong Dòng 1. Tuy nhiên, anh ta sử dụng lệnh hồi âm hồi âm với đối số đầu tiên của tập lệnh để xuất tên tệp. Anh ta sử dụng lệnh pipe để lấy đầu ra đó và sử dụng nó làm đầu vào cho phần tiếp theo. Sau đường ống, Myles gọi lệnh của aw awk, đây là một chương trình quét mẫu mạnh mẽ. Sử dụng cờ -F, anh ta nói với lệnh rằng ký tự tiếp theo (sau một khoảng trắng) là thứ sẽ xác định dấu phân cách trường Trường. Trong trường hợp này, đó là một khoảng thời gian.

    Bây giờ, awk thấy một tập tin có tên là ngonfile.mp3. Được tạo thành từ hai lĩnh vực:. Cuối cùng, anh ta sử dụng

    'in $ NF'

    để hiển thị trường cuối cùng. Trong trường hợp tệp của bạn có nhiều dấu chấm - do đó làm cho awk thấy nhiều trường - nó sẽ chỉ hiển thị cái cuối cùng, đó là phần mở rộng tệp.

    Trong Dòng 3, anh ta tạo một biến mới cho tên của tệp và sử dụng lệnh cơ sở dữ liệu tên lửa cơ sở dữ liệu để tham chiếu mọi thứ trong $ 1 ngoại trừ phần mở rộng tập tin. Điều này được thực hiện bằng cách sử dụng tên cơ sở và cho nó $ 1 làm đối số của nó, sau đó thêm một khoảng trắng và phần mở rộng tệp. Phần mở rộng tệp được tự động thêm vào do biến tham chiếu Dòng 2. Điều này sẽ làm là mất

    ngonfile.mp3

    và biến nó thành

    ngon miệng

    Sau đó, ở dòng cuối cùng, Myles kết hợp lệnh sẽ xuất mọi thứ theo thứ tự. Lưu ý rằng không có tham chiếu đến $ 2, một đối số thứ hai cho tập lệnh. Tập lệnh cụ thể này sẽ sao chép tập tin đã nói vào thư mục hiện tại của bạn. Công việc tuyệt vời Samuel và Myles!

    Chạy tập lệnh và $ PATH

    Chúng tôi cũng đề cập trong bài viết cơ bản của chúng tôi rằng các tập lệnh không được phép được tham chiếu như các lệnh theo mặc định. Đó là, bạn phải trỏ đến đường dẫn của tập lệnh để chạy nó:

    ./kịch bản

    ~ / bin / tập lệnh

    Nhưng, bằng cách đặt tập lệnh của bạn vào ~ / bin /, bạn có thể nhập tên của chúng từ bất cứ đâu để chạy chúng.

    Các nhà bình luận đã dành thời gian để tranh luận xem điều này đúng như thế nào, vì không có bản phân phối Linux hiện đại nào tạo thư mục đó theo mặc định. Hơn nữa, không ai thêm nó vào biến $ PATH theo mặc định, đây là điều bắt buộc để các tập lệnh được chạy như các lệnh. Tôi đã có một chút bối rối vì sau khi kiểm tra biến $ PATH của tôi, những người bình luận đã đúng, nhưng việc gọi các kịch bản vẫn làm việc cho tôi. Tôi đã tìm hiểu tại sao: nhiều bản phân phối Linux hiện đại tạo một tệp đặc biệt trong thư mục chính của người dùng - .profile.

    Tệp này được đọc bởi bash (trừ khi .bash_profile có trong thư mục chính của người dùng) và ở phía dưới, có một phần thêm ~ / bin / thư mục vào biến $ PATH nếu nó tồn tại. Vì vậy, bí ẩn đó được làm sáng tỏ. Trong phần còn lại của loạt bài, tôi sẽ tiếp tục đặt các tập lệnh trong thư mục ~ / bin / vì chúng là tập lệnh người dùng và có thể được chạy bởi người dùng. Và, có vẻ như chúng ta không thực sự cần phải làm phiền với biến $ PATH bằng tay để mọi thứ hoạt động.

    Lặp lại các lệnh với các vòng lặp

    Chúng ta hãy đến một trong những công cụ hữu ích nhất trong kho vũ khí để xử lý các nhiệm vụ lặp đi lặp lại: vòng lặp. Hôm nay, chúng ta sẽ thảo luận về các vòng lặp cho các vòng lặp.

    Các phác thảo cơ bản của một vòng lặp for như sau:

    cho BIẾN trong DANH SÁCH; làm
    lệnh1
    lệnh2
    Giáo dục
    chỉ huy
    làm xong

    VARIABLE có thể là bất kỳ biến nào, mặc dù hầu hết các chữ viết thường được sử dụng theo quy ước. DANH SÁCH là một danh sách các mặt hàng; bạn có thể chỉ định nhiều mục (phân tách chúng bằng khoảng trắng), trỏ đến tệp văn bản bên ngoài hoặc sử dụng dấu hoa thị (*) để biểu thị bất kỳ tệp nào trong thư mục hiện tại. Các lệnh được liệt kê được thụt lề theo quy ước, vì vậy sẽ dễ dàng hơn để xem lồng nhau - đặt các vòng lặp vào các vòng lặp (để bạn có thể lặp trong khi bạn lặp).

    Bởi vì danh sách sử dụng khoảng trắng làm dấu phân cách - nghĩa là khoảng trắng biểu thị việc di chuyển đến mục tiếp theo trong danh sách - các tệp có khoảng trắng trong tên không thân thiện lắm. Hiện tại, hãy kiên trì làm việc với các tệp không có dấu cách. Hãy bắt đầu với một tập lệnh đơn giản để hiển thị tên của các tệp trong thư mục hiện tại. Tạo một tập lệnh mới trong thư mục ~ / bin / của bạn có tên là loopscript. Nếu bạn không nhớ cách thực hiện việc này (bao gồm đánh dấu nó là có thể thực hiện được và thêm hack băm bang) hãy tham khảo bài viết cơ bản về kịch bản bash của chúng tôi.

    Trong đó, nhập mã sau đây:

    cho i trong item1 item2 item3 item4 item5 item6; làm
    tiếng vang $ i lòng
    làm xong

    Khi bạn chạy tập lệnh, bạn chỉ nên lấy các mục danh sách đó làm đầu ra.

    Khá đơn giản phải không? Hãy xem điều gì xảy ra nếu chúng ta thay đổi mọi thứ một chút. Thay đổi tập lệnh của bạn để nó nói điều này:

    cho tôi trong *; làm
    tiếng vang $ i lòng
    làm xong

    Khi bạn chạy tập lệnh này trong một thư mục, bạn sẽ nhận được một danh sách các tệp mà nó chứa dưới dạng đầu ra.

    Bây giờ, hãy thay đổi lệnh echo thành một cái gì đó hữu ích hơn - giả sử, lệnh zip. Cụ thể, chúng tôi sẽ thêm các tập tin vào một kho lưu trữ. Và, hãy lấy một số đối số trong hỗn hợp!

    cho tôi bằng $ @; làm
    kho lưu trữ zip
    làm xong

    Có gì đó mới! Một cách đơn giản là một lối tắt cho các loại $ 1 $ 2 $ 3 Nói cách khác, đó là danh sách đầy đủ của tất cả các đối số bạn đã chỉ định. Bây giờ, hãy xem điều gì xảy ra khi tôi chạy tập lệnh với một số tệp đầu vào.

    Bạn có thể xem tập tin nào trong thư mục của tôi. Tôi đã chạy lệnh với sáu đối số và mỗi tệp được thêm vào kho lưu trữ được nén có tên là archive archive.zip. Dễ thôi?

    Đối với các vòng lặp là khá tuyệt vời. Bây giờ bạn có thể thực hiện các chức năng hàng loạt trên danh sách các tập tin. Ví dụ: bạn có thể sao chép tất cả các đối số của tập lệnh vào kho lưu trữ được nén, di chuyển bản gốc sang một thư mục khác và tự động bảo mật sao chép tệp zip đó vào máy tính từ xa. Nếu bạn thiết lập các tệp chính bằng SSH, bạn thậm chí sẽ không cần nhập mật khẩu của mình và thậm chí bạn có thể yêu cầu tập lệnh xóa tệp zip sau khi tải lên!


    Sử dụng vòng lặp for giúp dễ dàng thực hiện một loạt các hành động cho tất cả các tệp trong một thư mục. Bạn có thể xếp nhiều loại lệnh với nhau và sử dụng các đối số rất dễ dàng để tạo và lập danh sách nhanh chóng, và đây chỉ là phần nổi của tảng băng trôi.

    Bash scripters, bạn có bất kỳ đề nghị? Bạn đã thực hiện một kịch bản hữu ích sử dụng các vòng lặp? Bạn muốn chia sẻ suy nghĩ của bạn về bộ phim? Để lại một số ý kiến ​​và giúp đỡ những người mới viết kịch bản khác!