Ngôn ngữ lệnh Shell. Học gì tiếp theo? Hãy bắt đầu: đăng nhập và đăng xuất

Như đã đề cập ở trên, để xây dựng các thuật toán tùy ý cần có các toán tử kiểm tra điều kiện. Vỏ bọc đánh đập hỗ trợ các tuyên bố lựa chọn nếu nhưsau đótrường hợp khác và trường hợp, cũng như các toán tử lặp ,trong khi, cho đến khi, làm cho nó trở thành một ngôn ngữ lập trình mạnh mẽ.

5.8.1 Người vận hành nếu nhưBài kiểm tra(hoặc )

Thiết kế điều hành có điều kiệnở dạng hơi đơn giản hóa, nó trông như thế này:

nếu list1 thì list2 khác list3 fi

Ở đâu danh sách1, danh sách2 và danh sách3 là các chuỗi lệnh được phân tách bằng dấu phẩy và kết thúc bằng dấu chấm phẩy hoặc ký tự dòng mới. Ngoài ra, các chuỗi này có thể được đặt trong dấu ngoặc nhọn: (danh sách).

Nhà điều hành nếu như kiểm tra giá trị được trả về bởi các lệnh từ danh sách1. Nếu có một số lệnh trong danh sách này thì giá trị được trả về bởi lệnh cuối cùng trong danh sách sẽ được chọn. Nếu giá trị này là 0 thì lệnh từ danh sách2; nếu giá trị này không bằng 0, các lệnh từ danh sách3. Giá trị được trả về bởi toán tử ghép như vậy nếu như, giống với giá trị được tạo bởi lệnh cuối cùng của chuỗi được thực hiện.

Định dạng lệnh đầy đủ nếu như có dạng:

nếu danh sách thì liệt kê [ danh sách Elif rồi liệt kê ] ... [ danh sách khác ] fi

(ở đây dấu ngoặc vuông chỉ có nghĩa là những gì chứa trong chúng không nhất thiết phải có trong toán tử).

Là một biểu thức xuất hiện ngay sau nếu như hoặc yêu tinh, một lệnh thường được sử dụng Bài kiểm tra, cũng có thể được biểu thị bằng dấu ngoặc vuông. Đội Bài kiểm trađánh giá một số biểu thức và trả về 0 nếu biểu thức đúng và 1 nếu ngược lại. Biểu thức được truyền vào chương trình Bài kiểm tra như một lý lẽ. Thay vì viết

biểu hiện kiểm tra,

Bạn có thể đặt biểu thức trong dấu ngoặc vuông:

[sự biểu lộ].

Xin lưu ý rằng Bài kiểm tra và [ là hai tên của cùng một chương trình, không phải một số chuyển đổi kỳ diệu được thực hiện bởi shell đánh đập(chỉ cú pháp [ yêu cầu bao gồm dấu ngoặc đơn đóng). Cũng lưu ý rằng thay vì Bài kiểm tra trong thiết kế nếu như bất kỳ chương trình có thể được sử dụng.

Để kết luận, chúng tôi đưa ra một ví dụ về việc sử dụng toán tử nếu như:

if [ -e textmode2.htm ] ; sau đó

ls chế độ văn bản*

khác

pwd

Về nhà điều hành Bài kiểm tra(hoặc […]) chúng ta cần có một cuộc trò chuyện đặc biệt.

5.8.2 Người vận hành Bài kiểm tra và điều kiện

Biểu thức điều kiện được sử dụng trong câu lệnh Bài kiểm tra, được xây dựng trên cơ sở kiểm tra thuộc tính file, so sánh chuỗi và so sánh số học thông thường. Các biểu thức phức tạp được xây dựng từ các biểu thức đơn nhất hoặc hoạt động nhị phân("gạch cơ bản"):

    Một tập tin

Đúng nếu tệp có tên file tồn tại.

    tập tin B

Đúng nếu tài liệu tồn tại và là một tập tin thiết bị khối đặc biệt.

    tập tin C

Đúng nếu tài liệu tồn tại và là một tập tin thiết bị ký tự đặc biệt.

    tập tin D

Đúng nếu tài liệu tồn tại và là một thư mục.

    Tập tin điện tử

Đúng nếu file có tên tài liệu tồn tại.

    tập tin F

Đúng nếu file có tên tài liệu tồn tại và là một tập tin thông thường.

    tập tin G

Đúng nếu file có tên tài liệu tồn tại và bit thay đổi nhóm của nó được thiết lập.

    Tệp H hoặc tệp -L

Đúng nếu file có tên tài liệu tồn tại và là một liên kết tượng trưng.

    tập tin K

Đúng nếu file có tên tài liệu tồn tại và bit "dính" của nó được thiết lập.

    tập tin P

Đúng nếu file có tên tài liệu tồn tại và là ống có tên(FIFO).

    tập tin R

Đúng nếu file có tên tài liệu tồn tại và đã đặt quyền đọc

    tập tin S

Đúng nếu file có tên tài liệu tồn tại và kích thước của nó lớn hơn 0.

    tfd

Đúng nếu bộ mô tả tập tin fdđang mở và trỏ đến thiết bị đầu cuối.

    tập tin của bạn

Đúng nếu file có tên tài liệu tồn tại và bit người dùng thay đổi của nó được thiết lập.

    tập tin W

Đúng nếu file có tên tài liệu tồn tại và có quyền ghi.

    tập tin X

Đúng nếu file có tên tài liệu tồn tại và có thể thực thi được.

    tập tin O

Đúng nếu file có tên tài liệu tồn tại và được sở hữu bởi người dùng được chỉ định bởi ID người dùng hiệu quả.

    tập tin G

Đúng nếu file có tên tài liệu tồn tại và thuộc về nhóm được xác định bởi ID nhóm hiệu quả.

    tập tin S

Đúng nếu file có tên tài liệu tồn tại và là một ổ cắm.

    tập tin N

Đúng nếu file có tên tài liệu tồn tại và đã thay đổi kể từ lần đọc cuối cùng.

    tập tin1 -nt tập tin2

Đúng nếu tập tin tập tin1 có thời gian sửa đổi muộn hơn tập tin2.

    tập tin1 -ot tập tin2

Đúng nếu tập tin tập tin1 Lớn tuổi hơn tập tin2.

    tập tin1 -ef tập tin2

Đúng nếu các tập tin tập tin1tập tin2có cùng thiết bị và số inode(inode).

    O tên chọn

Đúng nếu tùy chọn shell được bật tên lựa chọn. Để được giải thích, hãy xem trang bash man.

    chuỗi Z

Đúng nếu độ dài của chuỗi bằng 0.

    chuỗi N

Đúng nếu độ dài của chuỗi không bằng 0.

    chuỗi1 == chuỗi2

Đúng nếu các chuỗi khớp nhau. Thay vì == có thể được sử dụng = .

    chuỗi1 !== chuỗi2

Đúng nếu các chuỗi không khớp.

    chuỗi1< string2

Đúng nếu dòng chuỗi1 theo từ điển đứng trước chuỗi chuỗi2(đối với ngôn ngữ hiện tại).

    chuỗi1 > chuỗi2

Đúng nếu dòng chuỗi1 theo từ điển xuất hiện sau dòng chuỗi2(đối với ngôn ngữ hiện tại).

    arg1 OP arg2

Đây OP- ừ sau đó là một trong các phép toán so sánh số học: -eq(bằng), -ne(không công bằng), -lt(ít hơn), -le(nhỏ hơn hoặc bằng), -gt(hơn), -ge(nhiều hơn hoặc bằng). Số nguyên dương hoặc âm có thể được sử dụng làm đối số.

Từ các biểu thức điều kiện cơ bản này, bạn có thể xây dựng mức độ phức tạp tùy thích bằng cách sử dụng các phép toán logic thông thường như phủ định, AND và OR:

    !(sự biểu lộ)

Toán tử phủ định Boolean.

    biểu thức1 -a biểu thức2

Toán tử Boolean (VÀ). Đúng nếu cả hai biểu thức đều đúng.

    biểu thức1 -o biểu thức2

Toán tử Boolean HOẶC(HOẶC). Đúng nếu một trong hai biểu thức đúng.

Các biểu thức điều kiện tương tự được sử dụng trong các toán tử trong khicho đến khi, mà chúng ta sẽ xem xét dưới đây.

5.8.3 Người vận hành trường hợp

Định dạng toán tử trường hợp là:

từ viết hoa trong danh sách [ [(] mẫu [ | mẫu ] ...) ;; ]...esac

Đội trường hợpđầu tiên tạo ra sự mở rộng từ từ và cố gắng khớp kết quả với từng mẫu mẫu từng cái một. Sau khi tìm thấy kết quả khớp đầu tiên, không có kiểm tra nào nữa được thực hiện; danh sách các lệnh theo mẫu tìm thấy kết quả khớp được thực thi. Giá trị được toán tử trả về là 0 nếu không tìm thấy mẫu nào khớp. Ngược lại, giá trị được tạo bởi lệnh cuối cùng trong danh sách tương ứng sẽ được trả về.

Ví dụ sau đây về việc sử dụng câu lệnh tình huống được lấy từ tập lệnh hệ thống /etc/rc.d/rc.sysinit.

trường hợp "$UTC" trong

có|đúng)

CLOCKFLAGS="$CLOCKFLAGS -u";

CLOCKDEF="$CLOCKDEF (utc)";

không|sai)

CLOCKFLAGS="$CLOCKFLAGS --localtime";

CLOCKDEF="$CLOCKDEF (giờ địa phương)";

esac

Nếu biến đánh giá là có hoặc đúng thì cặp lệnh đầu tiên sẽ được thực thi và nếu giá trị của nó là no hoặc sai thì cặp lệnh thứ hai sẽ được thực thi.

5.8.4 Người vận hành lựa chọn

Nhà điều hành lựa chọn cho phép bạn tổ chức tương tác tương tác với người dùng. Nó có định dạng sau:

chọn tên [trong word; ] lập danh sách ; xong

Đầu tiên từ mẫu từ một danh sách các từ phù hợp với mẫu được tạo ra. Tập hợp các từ này được xuất ra luồng lỗi tiêu chuẩn, với mỗi từ kèm theo một số thứ tự. Nếu mẫu từ bị bỏ qua, các tham số vị trí được suy ra theo cách tương tự. Sau đó, lời nhắc PS3 tiêu chuẩn sẽ được đưa ra và trình bao sẽ đợi một dòng được nhập vào đầu vào tiêu chuẩn. Nếu chuỗi đã nhập chứa một số tương ứng với một trong các từ được hiển thị thì biến tênđược gán một giá trị bằng từ đó. Nếu nhập một dòng trống, các số và từ tương ứng sẽ được hiển thị lại. Nếu bất kỳ giá trị nào khác được nhập vào, biến tênđược gán giá trị bằng 0. Chuỗi do người dùng nhập vào được lưu trữ trong một biến HỒI ĐÁP. Danh sách lệnh danh sáchđược thực hiện với giá trị biến đã chọn tên.

Đây là một kịch bản nhỏ:

#!/bin/sh

echo "Bạn thích hệ điều hành nào hơn?"

chọn var trong "Linux" "Gnu Hurd" "BSD miễn phí" "Khác"; LÀM

phá vỡ

xong

echo "Bạn sẽ chọn $var"

Bạn thích hệ điều hành nào hơn?
1) Linux
2) Gnu Hurd
3) BSD miễn phí
4) Khác
#?

Nhấn bất kỳ số nào trong 4 số gợi ý (1,2,3,4). Ví dụ: nếu bạn nhập 1, bạn sẽ thấy thông báo:

“Bạn sẽ chọn Linux”

5.8.5 Người vận hành

Nhà điều hành hoạt động hơi khác một chút so với các ngôn ngữ lập trình thông thường. Thay vì tăng hoặc giảm giá trị của một số biến mỗi lần nó đi qua vòng lặp, nó sẽ gán giá trị tiếp theo từ danh sách các từ nhất định cho biến đó mỗi lần nó đi qua vòng lặp. Nói chung, thiết kế trông giống như thế này:

cho tên trong từ làm danh sách xong.

Quy tắc xây dựng danh sách lệnh ( danh sách) giống như trong toán tử nếu như.

Ví dụ. Đoạn script sau tạo các tệp foo_1, foo_2 và foo_3:

cho a trong 1 2 3 ; LÀM

chạm vào foo_$a

xong

Nói chung cho tuyên bố có định dạng:

cho tên [bằng chữ; ] lập danh sách ; xong

Đầu tiên, lời nói được tiết lộ từ phù hợp với các quy tắc công bố biểu thức được đưa ra ở trên. Sau đó biến tên các giá trị kết quả được gán lần lượt và danh sách các lệnh được thực thi mỗi lần điều này. Nếu như " trong từ" bị thiếu thì danh sách lệnh danh sáchđược thực thi một lần cho mỗi tham số vị trí được chỉ định.

Linux có một chương trình thứ tự, lấy hai số làm đối số và tạo ra một chuỗi gồm tất cả các số nằm giữa các số đã cho. Với lệnh này bạn có thể buộc V. đánh đập hoạt động giống hệt như cách một toán tử tương tự hoạt động trong các ngôn ngữ lập trình thông thường. Để làm điều này, chỉ cần viết chu trình theo cách sau:

cho a trong $(seq 1 10) ; LÀM

tập tin mèo_$a

xong

Lệnh này hiển thị nội dung của 10 file: " tệp_1", ..., "tệp_10".

5.8.6 Người vận hành trong khicho đến khi

Nhà điều hành trong khi hoạt động như nếu như, chỉ thực thi các toán tử từ danh sách danh sách2 Vòng lặp tiếp tục cho đến khi điều kiện đúng và hủy nếu điều kiện không đúng. Thiết kế trông như thế này:

trong khi list1 làm list2 xong.

while [ -d mydirectory ] ; LÀM

ls -l mydirectory >> logfile

echo -- SEPARATOR -- >> logfile

ngủ 60

xong

Một chương trình như vậy sẽ ghi lại nội dung của thư mục "mydirectory" mỗi phút miễn là thư mục đó tồn tại.

Nhà điều hành cho đến khi tương tự như nhà điều hành trong khi:

cho đến khi list1 làm xong list2.

Điểm khác biệt là kết quả trả về khi thực hiện danh sách câu lệnh danh sách1, được hiểu với sự phủ định: danh sách2được thực thi nếu lệnh cuối cùng trong danh sách danh sách1 trả về trạng thái thoát khác 0.

5.8.7 Chức năng

Cú pháp

Vỏ bọc đánh đập cho phép người dùng tạo ra các chức năng của riêng mình. Các hàm hoạt động và được sử dụng giống hệt như các lệnh shell thông thường, nghĩa là chúng ta có thể tự tạo các lệnh mới. Các hàm được xây dựng như sau:

tên hàm() (danh sách)

Và từ chức năng không cần thiết, tên xác định tên của hàm mà nó có thể được truy cập và phần thân của hàm bao gồm một danh sách các lệnh danh sách, nằm giữa ( và ). Danh sách lệnh này được thực thi mỗi khi tên tênđược chỉ định làm tên của lệnh để gọi. Lưu ý rằng các hàm có thể được định nghĩa đệ quy, do đó được phép gọi hàm mà chúng ta định nghĩa bên trong chính hàm đó.

Các hàm được thực thi trong ngữ cảnh của shell hiện tại: để diễn giải hàm quy trình mới không chạy (không giống như thực thi các tập lệnh shell).

Tranh luận

Khi một hàm được gọi để thực thi, các đối số của hàm sẽ trở thành thông số vị trí(tham số vị trí) trong suốt thời gian của chức năng. Họ được gọi là $n, Ở đâu N— số đối số mà chúng ta muốn truy cập. Đánh số đối số bắt đầu từ 1, vì vậy $1 - đây là lý lẽ đầu tiên. Chúng ta cũng có thể nhận được tất cả các đối số cùng một lúc với $* và số lượng đối số sử dụng $# . Tham số vị trí 0 không thay đổi.

Nếu một lệnh tích hợp xuất hiện trong thân hàm trở lại, việc thực thi hàm bị gián đoạn và quyền điều khiển được chuyển sang lệnh sau lệnh gọi hàm. Khi chức năng hoàn thành, các tham số vị trí và tham số đặc biệt # các giá trị mà chúng có trước khi hàm bắt đầu được trả về.

Biến cục bộ (cục bộ)

Nếu muốn tạo một tham số cục bộ, chúng ta có thể sử dụng từ khóa địa phương. Cú pháp để xác định nó hoàn toàn giống với các tham số thông thường, chỉ có định nghĩa được đặt trước bởi một từ khóa địa phương: địa phương tên=giá trị.

Dưới đây là một ví dụ về việc chỉ định một hàm thực hiện lệnh được đề cập ở trên thứ tự:

seq()

địa phương tôi=$1;

trong khi [ $2 != $I ]; LÀM

echo -n "$I";

Tôi=$(($I + 1))

xong;

tiếng vang $2

Xin lưu ý tùy chọn -N nhà điều hành tiếng vọng, nó hủy dòng mới. Mặc dù điều này không cần thiết cho các mục đích mà chúng tôi đề cập ở đây nhưng nó có thể hữu ích khi sử dụng hàm này cho các mục đích khác.

Hàm tính giai thừa sự thật

Một ví dụ nữa:

sự thật()

nếu [$1 = 0]; sau đó

tiếng vang 1;

khác

echo $(($1 * $(thực tế $(($1 - 1)))))

Đây là hàm giai thừa, một ví dụ về hàm đệ quy. Lưu ý mở rộng số học và thay thế lệnh.

V. Kostromin (kos và rus-linux dot net) - 5.8. Shell là ngôn ngữ lập trình

Shell là gì và tại sao nó lại cần thiết?

Shell lệnh trong bất kỳ hệ thống giống unix nào, bao gồm GNU/Linux, là chương trình thường xuyên, được khởi chạy cả trong bảng điều khiển văn bản (ngày càng ít được sử dụng) và trong môi trường đồ họa– trong cửa sổ trình mô phỏng thiết bị đầu cuối, có sẵn trên mọi hệ thống Linux.

Nhiệm vụ của nó rất đơn giản và rõ ràng: chấp nhận một dòng (hoặc các dòng) đầu vào, phân tích chúng và dựa trên kết quả phân tích này, phản ứng tương ứng - thực thi lệnh, chạy chương trình, hiển thị thông báo chẩn đoán, v.v.

Trong hầu hết các bản phân phối Linux, người dùng được gán lệnh lệnh theo mặc định. vỏ bash(Bourne Again SHell là một shell Bourne khác; Steve Bourne là tác giả của shell lệnh đầu tiên trong Unix - sh). Trên thực tế, nó đã trở thành một tiêu chuẩn không chính thức và những cải tiến cho nó chức năng tiếp tục liên tục. Có các shell lệnh khác - tcsh (phiên bản của C-shell), ksh (Korn Shell), zsh, v.v. – mỗi người đều có những ưu điểm và nhược điểm riêng, cũng như có nhóm người hâm mộ riêng. Tuy nhiên, bash quen thuộc hơn với công chúng với cấp độ khác nhau chuẩn bị, đó là lý do tại sao tôi chọn nó. Điều đáng chú ý là cho dù các loại vỏ khác nhau có khả năng gì thì chúng đều tương thích với tổ tiên tư tưởng của chúng - Bourn Shell (sh). Nói cách khác, một tập lệnh được viết cho sh sẽ hoạt động chính xác trong bất kỳ shell hiện đại nào (điều ngược lại thường không đúng).

Lợi ích của dòng lệnh

Câu hỏi có thể đặt ra: tại sao phải bận tâm đến dòng lệnh nếu có giao diện đồ họa đẹp và tiện lợi? Có nhiều lý do cho việc này. Thứ nhất, không phải mọi thao tác đều thuận tiện hơn hoặc nhanh hơn khi thực hiện bằng cách sử dụng GUI. Thứ hai, mọi chương trình đều tuân theo nguyên tắc cơ bản của hệ thống Unix: thực hiện một công việc được xác định rõ ràng và làm tốt nó. Nói cách khác, bạn luôn hiểu điều gì xảy ra khi bạn chạy một tiện ích cụ thể (nếu có điều gì đó không hoàn toàn rõ ràng, bạn nên tham khảo hướng dẫn sử dụng). Thứ ba, bằng cách thành thạo các lệnh, thử kết hợp và kết hợp các tham số của chúng, người dùng sẽ nghiên cứu hệ thống, thu được kinh nghiệm thực tế quý giá. Bạn có quyền truy cập vào các công cụ mạnh mẽ như đường dẫn cho phép bạn tổ chức một chuỗi lệnh để xử lý dữ liệu, công cụ chuyển hướng I/O và bạn cũng có thể lập trình trực tiếp từ trình bao lệnh. Có lẽ cần tập trung vào việc lập trình chi tiết hơn, đặc biệt vì nhiều tập lệnh hệ thống trong Linux (ví dụ: tập lệnh khởi động Dịch vụ hệ thống) được viết cho shell.

Lệnh shell như một ngôn ngữ lập trình

Vì vậy, shell lệnh có thể được coi là một ngôn ngữ lập trình và là môi trường phần mềm thực hiện đồng thời. Tất nhiên, ngôn ngữ này không được biên dịch mà được giải thích. Nó cho phép sử dụng các biến: hệ thống hoặc sở hữu. Trình tự thực hiện các lệnh chương trình được thay đổi bằng cách sử dụng các cấu trúc kiểm tra điều kiện và chọn tùy chọn thích hợp: if-then-else và case. Các vòng lặp while, Until và for cho phép bạn tự động hóa các hành động lặp đi lặp lại. Có thể kết hợp các nhóm lệnh thành các khối logic. Bạn thậm chí có thể viết các hàm thực truyền tham số cho chúng. Vì vậy, tất cả các dấu hiệu và đặc điểm của một ngôn ngữ lập trình chính thức đều có sẵn. Hãy cố gắng nhận được lợi ích gấp đôi từ việc này - cùng với việc học những kiến ​​​​thức cơ bản về lập trình, chúng ta sẽ tự động hóa công việc hàng ngày của mình.

Chào thế giới! Hệ thống sao lưu đơn giản

Về nhu cầu thường xuyên Dự trữ bản sao Mọi người đều biết dữ liệu nhưng người dùng không bao giờ có đủ thời gian cho thao tác nhàm chán này. Giải pháp rất đơn giản - tổ chức tự động tạo các bản sao lưu. Đây sẽ là nhiệm vụ lập trình shell đầu tiên của chúng ta.

#!/bin/bash # # Sao lưu các thư mục và tập tin từ thư mục chính # Tập lệnh bó này có thể được chạy tự động bằng cron # cd $HOME nếu [ ! -d archives ] sau đó mkdir archives fi cur_date=`date +%Y%m%d%H%M` if [ $# -eq 0 ] ; thì tar czf archive$(cur_date).tar.gz dự án bin else tar czf archive$(cur_date).tar.gz $* fi if [ $? = 0] ; sau đó mv archive$(cur_date).tar.gz $HOME/archives echo "$cur_date – Sao lưu hoàn tất thành công." else echo "$cur_date - LỖI trong quá trình sao lưu." fi

Bất kỳ tập lệnh lệnh nào (tập lệnh là tập lệnh, vì các chương trình shell lệnh được gọi) đều bắt đầu bằng một dòng định danh, trong đó trình thông dịch lệnh được chỉ định rõ ràng, cho biết đường dẫn đầy đủ đến nó. Đường dẫn đầy đủ là một danh sách tuần tự của tất cả các thư mục, bắt đầu từ thư mục gốc, phải được nhập để đến tệp đích và tất nhiên là tên của tệp này. Việc ghi lại đường dẫn đầy đủ là cực kỳ quan trọng để xác định duy nhất từng tệp trong hệ thống phân cấp tệp.

Tiếp theo là bốn dòng bình luận. Khi shell gặp ký tự "#", nó xử lý tất cả các ký tự tiếp theo dưới dạng nhận xét và hoàn toàn bỏ qua chúng cho đến cuối dòng hiện tại. Do đó, bạn có thể bắt đầu một nhận xét không phải ngay từ đầu dòng mà kèm theo nó bằng một số lệnh.

Sau phần bình luận có một dòng trống. Nó không có ý nghĩa gì đối với shell lệnh và không có hành động nào được thực hiện. Trong các tập lệnh, các dòng trống thường được chèn vào để mã dễ đọc hơn.

Cuối cùng chúng tôi đã đến được đội “thực sự” đầu tiên. Nó cho phép bạn thay đổi thư mục (Change Directory), tức là. di chuyển từ thư mục hiện tại sang thư mục khác được truyền vào lệnh làm đối số. Trong hầu hết các trường hợp, thư mục đích được chỉ định rõ ràng, ví dụ: các dự án cd /tmp hoặc cd, nhưng trong trường hợp của chúng tôi, biến hệ thống được xác định trước HOME được sử dụng - nó chứa đường dẫn đầy đủ đến thư mục chính người dùng hiện tại, thay mặt cho tập lệnh được thực thi. Điều này giúp loại bỏ nhu cầu thực hiện thay đổi mã mỗi khi chúng tôi thay đổi người dùng, vì lệnh sẽ đưa mọi người trở lại thư mục cá nhân của họ. Ký hiệu đô la "$" ở phía trước tên biến có nghĩa là bạn cần trích xuất giá trị có trong biến đó và thay thế nó vào vị trí của tên biến trên dòng lệnh. Cần đặc biệt lưu ý rằng trong ngôn ngữ lệnh, vỏ chữ cái viết hoa rất quan trọng, tức là HOME, Home và home là ba biến khác nhau. Theo quy ước, các chữ in hoa biểu thị tên của các biến hệ thống: HOME, PATH, EDITOR, v.v. Quy ước này không ngăn cản người dùng tạo các biến riêng của họ với tên từ chữ in hoa, nhưng tại sao lại làm phức tạp cuộc sống của bạn bằng cách vi phạm các chuẩn mực và quy tắc được chấp nhận chung? Cũng không nên thay đổi giá trị của các biến hệ thống trừ khi thực sự cần thiết. Nói chung, chúng tôi tuân theo một quy tắc đơn giản: chúng tôi sử dụng các biến hệ thống cho mục đích chỉ đọc và nếu cần biến của riêng mình, chúng tôi viết tên của nó bằng chữ thường.

Lệnh đầu tiên của chúng ta có thể được viết ngắn gọn hơn:

đĩa ~

Ở đây ký hiệu "~" cũng có nghĩa là thư mục chính của người dùng hiện tại. Các cựu chiến binh dòng lệnh thậm chí còn nói ngắn gọn hơn:

đĩa CD

Ý tưởng là khi lệnh cd không có đối số, nó sẽ chuyển sang thư mục chính.

Tiếp theo là thiết kế phần mềm cổ điển để kiểm tra các điều kiện và đưa ra quyết định phù hợp. Đề án chung có phải đây là:

nếu như<условие>sau đó<одна или несколько команд>fi

Từ cuối cùng của cấu trúc (nếu ở thứ tự ngược lại) hoạt động như một dấu ngoặc đơn đóng, tức là ranh giới của danh sách các lệnh được thực thi khi điều kiện đúng. Sự hiện diện của fi là bắt buộc, ngay cả khi chỉ có một đội trong danh sách.

Để kiểm tra một điều kiện, theo quy tắc, lệnh kiểm tra hoặc dạng ký hiệu thay thế trong ngoặc vuông được sử dụng. Nói cách khác, hồ sơ

nếu như [! -d archives] nếu kiểm tra ! -d lưu trữ

hoàn toàn tương đương. Tôi thích dấu ngoặc vuông hơn vì chúng xác định rõ ràng hơn ranh giới của điều kiện đang được kiểm tra. Cả dấu ngoặc đơn bên phải và bên trái phải được phân tách khỏi điều kiện bằng dấu cách.

Tiêu chí để kiểm tra điều kiện được xác định bởi nhiều cờ khác nhau. Lệnh kiểm tra nhận ra một danh sách rất lớn trong số chúng. Trong ví dụ của chúng tôi, cờ -d được sử dụng, cho phép chúng tôi kiểm tra xem tên được chỉ định sau cờ có thực sự khớp hay không thư mục hiện có(danh mục). Các cờ sau thường được sử dụng nhất khi làm việc với tệp:

F – nó có tồn tại không tập tin thông thường với một cái tên nhất định;

R – liệu tệp được chỉ định có quyền đọc từ nó hay không;

W – liệu tập tin được chỉ định có quyền ghi vào nó hay không;

X – liệu tệp được chỉ định có quyền thực thi nó hay không;

S – liệu tệp được chỉ định có kích thước khác 0 hay không.

Trong trường hợp của chúng tôi, điều kiện được đặt trước bởi Dấu chấm than, biểu thị hoạt động phủ định logic nên ý nghĩa của điều kiện đang được kiểm tra trở nên trái ngược hoàn toàn. Chúng ta hãy thử viết ra ý nghĩa của các lệnh này bằng tiếng Nga thông thường:

nếu như [! -d archives ] Nếu thư mục archives (trong thư mục hiện tại) không tồn tại, thì hãy bắt đầu thực thi khối lệnh: mkdir archives tạo thư mục archives (trong thư mục hiện tại) fi end thực thi khối lệnh.

Như bạn có thể thấy, mọi thứ hóa ra không quá phức tạp. Với một chút luyện tập, bạn có thể dễ dàng đọc và tự mình tạo ra các thiết kế tương tự. Lệnh tạo thư mục quá rõ ràng nên không cần giải thích gì thêm.

TRONG hàng tiếp theo chúng tôi tạo biến cục bộ của riêng mình cur_date. Trong phần lớn các trường hợp, các biến được tạo bằng cách chỉ định một giá trị cụ thể, ví dụ:

ten=10 string="Đây là một dòng văn bản"

Nhưng trong ví dụ của chúng tôi nó được áp dụng thủ thuật nhỏ. Xin lưu ý rằng sau dấu bằng - ký hiệu gán - lệnh được viết bằng dấu ngoặc kép. Dạng ký hiệu này cho phép bạn gán cho một biến không phải là chính chuỗi mà là kết quả thực thi của nó. Đây là đầu ra của lệnh date, trả về ngày và giờ hiện tại ở định dạng được chỉ định bởi danh sách các tham số:

%Y – năm hiện tại ở dạng đầy đủ, tức là có bốn chữ số (ví dụ: 2009);

%m – số Tháng này(ví dụ: 09 – cho tháng 9);

%d – số ngày hiện tại;

%H – giờ hiện tại ở định dạng 24 giờ;

%M – phút hiện tại.

Vì vậy, nếu bạn chạy lệnh

cur_date=`ngày +%Y%m%d%H%M`

vào ngày 10 tháng 9 năm 2009 lúc 22:45 thì biến cur_date sẽ được gán Chuỗi giá trị"200909102245". Mục đích của thủ thuật này là tạo một tên duy nhất, không lặp lại cho file lưu trữ. Nếu bạn định chạy nhiều phiên bản của chương trình trong vòng một phút, bạn có thể cải thiện tính duy nhất của tên bằng cách thêm giây hiện tại. Làm sao? Nghiên cứu hướng dẫn sử dụng tiện ích ngày tháng (người đàn ông ngày) - không có gì phức tạp về nó.

Trước khi bắt đầu tạo tệp lưu trữ, chúng tôi cần xác định thư mục nào chúng tôi sẽ lưu trong đó. Để linh hoạt hơn, chúng tôi có thể chỉ định một tập hợp các thư mục sẽ được lưu trữ theo mặc định, nhưng cung cấp khả năng thay thế tập hợp này bằng danh sách các thư mục được chuyển làm đối số cho tập lệnh của chúng tôi. Với mục đích này, các biến shell lệnh đặc biệt được sử dụng: $# – số lượng tham số được truyền cho tập lệnh và $* – tất cả các tham số được truyền, được viết ở định dạng một dòng.

nếu [ $# -eq 0 ] ; sau đó

Kiểm tra điều kiện “nếu số lượng tham số được truyền bằng 0”, sau đó thực hiện lệnh sau. Lưu ý rằng từ khóa then có thể được viết trên dòng điều kiện, được phân tách khỏi biểu thức điều kiện bằng dấu chấm phẩy.

tar czf archive$(cur_date).tar.gz bin dự án

Lệnh tạo một file lưu trữ và nén file này. Bản thân tiện ích tar không thực hiện nén mà chỉ thu thập tất cả các tệp và thư mục được chỉ định vào một tệp tar duy nhất. Cờ đầu tiên dành cho việc này - c (tạo). Nén thực hiện chương trình bên ngoài– đây là gzip, được gọi bằng cờ thứ hai - z. Nếu bạn đã cài đặt chương trình nén bzip2 hiệu quả hơn trên hệ thống của mình, bạn có thể tận dụng lợi thế của nó bằng cách sửa đổi lệnh như sau:

tar cjf archive$(cur_date).tar.bz2 thùng dự án

Cờ thứ ba f chỉ ra rằng phần tiếp theo là tên của tệp lưu trữ, vì vậy nó luôn là cờ cuối cùng trong danh sách các cờ. Lưu ý khi thay thế, tên biến được đặt trong dấu ngoặc nhọn. Điều này được thực hiện để làm nổi bật rõ ràng biến trên đường bao quanh nó, từ đó loại bỏ nhiều vấn đề tiềm ẩn. Tiện ích mở rộng tập tin lưu trữ không được chỉ định tự động; bạn tự điền mọi thứ bạn cần. Tôi đã chỉ định các dự án và bin làm thư mục mặc định để lưu trữ, nhưng bạn có thể ghi lại tên của các thư mục có giá trị nhất tại đây.

Từ khóa else mở ra một nhánh thực thi thay thế. Các lệnh của khối này bắt đầu hoạt động nếu kiểm tra điều kiện trả về kết quả “false” (trong ví dụ của chúng tôi: “số lượng tham số được truyền khác 0”, tức là tên thư mục do người dùng chỉ định). Trong trường hợp này lệnh sẽ trông như thế này:

tar czf archive$(cur_date).tar.gz $*

Ở đây các thư mục mặc định được thay thế bằng chuỗi tên thư mục được chấp nhận bên ngoài. Có thể chấp nhận và xử lý từng tham số bên ngoài một cách riêng biệt nhưng sẽ thuận tiện hơn cho chúng ta khi truyền toàn bộ chuỗi.

Vào cuối chương trình, một kiểm tra khác được thực hiện. Trong môi trường Unix, tất cả các lệnh đều trả về mã trạng thái hoàn thành. Nếu lệnh thành công, nó sẽ trả về mã 0, nếu không thì mã thoát sẽ khác 0. Để kiểm tra sự thành công của lệnh lưu trữ trước đó, chúng ta sẽ sử dụng một biến đặc biệt khác $?, biến này luôn chứa giá trị mã hoàn thành của lệnh gần đây nhất. Nếu trong biến $? chứa 0, tức là File backup đã được tạo thành công, sau đó chúng ta di chuyển nó vào thư mục lưu trữ:

mv archive$(cur_date).tar.gz $HOME/archives

và hiển thị thông báo tương ứng:

echo "$cur_date – Sao lưu hoàn tất thành công."

Nếu việc kiểm tra cho thấy mã hoàn thành cho thao tác lưu trữ không bằng 0, sau đó sẽ hiển thị thông báo lỗi:

echo "$cur_date - LỖI trong quá trình sao lưu."

Điều này hoàn thành tập lệnh của chúng tôi.

Để kiểm tra hoạt động của chương trình của chúng tôi, bạn cần lưu lại ở trên nguồn trong một tệp có tên bckp chẳng hạn, sau đó làm cho nó có thể thực thi được để thuận tiện:

chmod 750 bckp

và chạy:

./bckp

để tạo bản sao lưu của các thư mục mặc định và

./bckp docs progs hoạt động

để tạo bản sao lưu của các thư mục được liệt kê (chỉ định tên của các thư mục thực sự tồn tại trên hệ thống của bạn, nếu không bạn sẽ nhận được thông báo lỗi).

Bạn có thể đặt tệp bckp vào một trong các thư mục được chỉ định trong biến PATH của hệ thống. Các vị trí ưa thích nhất là /usr/local/bin hoặc $HOME/bin nếu bạn có chúng. Sau này, bạn có thể chạy bckp dưới dạng lệnh hệ thống.

Cách tự động hóa các hoạt động sao lưu theo lịch trình

Một vài lời về tự động sao lưu. Với mục đích này, hệ thống phục vụ lập lịch cron, đọc hướng dẫn công việc từ một tệp crontab đặc biệt. Để xác định các hướng dẫn như vậy, bạn cần tạo và chỉnh sửa tệp crontab của mình bằng lệnh:

crontab -e

Hướng dẫn được viết theo định dạng được xác định nghiêm ngặt (các trường được phân tách bằng dấu cách):

phút giờ lệnh ngày_of_tháng tháng day_of_week

Một tùy chọn để lên lịch các hoạt động sao lưu có thể trông như thế này:

30 23 10,20,30 * * /usr/local/bin/bckp

Điều này có nghĩa là tập lệnh sao lưu (bạn phải cung cấp đường dẫn đầy đủ đến tệp này) sẽ chạy vào lúc 23:30 các ngày 10, 20 và 30 hàng tháng, bất kể ngày nào trong tuần. (Dấu hoa thị cho biết toàn bộ phạm vi giá trị cho phép, trong trong trường hợp này: hàng tháng - ở trường thứ 4, bất kỳ ngày nào trong tuần - ở trường thứ 5)

Nếu bạn muốn tóm tắt kết quả theo tuần và hệ thống của bạn chạy 24/7 thì nên lên lịch sao lưu trong giờ thấp điểm:

0 5 * * 3.5 /usr/local/bin/bckp

Đây bản sao lưu sẽ được tạo vào lúc 5:00 thứ Tư và thứ Sáu hàng tháng (dấu hoa thị ở trường thứ 4), bất kể ngày nào (dấu hoa thị ở trường thứ 3).

Bạn có thể đọc về tất cả những điều phức tạp của việc lập lịch trong hướng dẫn sử dụng crontab man 5.

Kết quả và kết luận

Tập lệnh sao lưu được thảo luận trong bài viết này có các thuộc tính chức năng khiêm tốn. Nhưng đó không phải là quan điểm của anh ấy nhiệm vụ chinh, nhưng để người đọc hiểu những gì có thể được thực hiện trong dòng lệnh, và không chỉ sao chép và thực thi tệp lệnh được đề xuất mà còn quan tâm đến việc mở rộng các chức năng của nó và bắt đầu nghiên cứu những khả năng to lớn mà shell lệnh mang lại. Và nếu ai đó, sau khi đọc bài viết này, cố gắng cải thiện mã được đưa ra ở đây hoặc viết phiên bản riêng, hoặc thực hiện được ý tưởng độc lập của mình thì tôi coi như đã đạt được mục tiêu chính.

Tài nguyên để tải xuống

static.content.url=http://www.site/developerworks/js/artrated/

Bài viếtID=458335

ArticleTitle=Cơ bản về lập trình Shell

Ngôn ngữ lập trình vỏ có một số thiết kế sẽ mang lại sự linh hoạt cho các chương trình của bạn:

  • Các bài bình luận sẽ cho phép bạn mô tả các chức năng của chương trình;
  • "tài liệu ở đây" cho phép bạn bao gồm các dòng trong shell của chương trình sẽ được chuyển hướng làm đầu vào cho một số lệnh shell của chương trình;
  • Lệnh thoát cho phép bạn kết thúc chương trình trong đúng điểm và sử dụng mã trả lại;
  • Cấu trúc vòng lặp for và while cho phép bạn lặp lại một nhóm lệnh trong vòng lặp;
  • các lệnh có điều kiện if và case thực thi một nhóm lệnh nếu một số điều kiện được đáp ứng;
  • Lệnh break cho phép bạn thoát khỏi vòng lặp một cách vô điều kiện.

9.3.1. Bình luận

Để đặt chú thích trong chương trình, hãy sử dụng dấu #. Nếu dấu # xuất hiện sau một lệnh thì lệnh đó sẽ được thực thi và chú thích sẽ bị bỏ qua. Định dạng dòng bình luận:

#bình luận

9.3.2. "Tài liệu đây"

"Tài liệu ở đây" cho phép bạn đặt các dòng trong chương trình shell được chuyển hướng dưới dạng đầu vào lệnh trong chương trình đó. Đây là một cách để cung cấp đầu vào cho lệnh trong chương trình shell mà không cần sử dụng tệp riêng. Mục nhập bao gồm một ký tự chuyển hướng<< и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак!.

Dạng lệnh như sau:

Yêu cầu<...dòng đầu vào... dấu phân cách

9.3.3. Sử dụng ed trong chương trình shell

"Tài liệu ở đây" gợi ý cách sử dụng ed trong chương trình shell. Giả sử bạn muốn tạo một chương trình shell sẽ gọi trình soạn thảo ed, thực hiện các thay đổi chung cho một tệp, ghi các thay đổi vào tệp và sau đó thoát ed. Màn hình sau hiển thị nội dung của chương trình ch.text, chương trình thực hiện các tác vụ sau:

$ cat ch.text echo Nhập tên tập tin read file1 echo Nhập chính xác văn bản cần thay đổi. đọc old_text echo Nhập chính xác văn bản mới để thay thế văn bản trên. đọc new_text ed - $file1<

Lưu ý dấu - (trừ) trong lệnh ed. Tùy chọn này ngăn không cho bộ đếm ký tự được in trên màn hình. Cũng lưu ý định dạng của lệnh ed để thay thế toàn cục:

G/$old_text/s//$new_text/g

Chương trình sử dụng 3 biến: file1, old_text, new_text. Khi chạy, chương trình này sử dụng lệnh đọc để lấy giá trị của các biến này. Các biến này chứa các thông tin sau:
tập tin - tên của tập tin sẽ được chỉnh sửa;
old_text - văn bản sẽ được thay đổi;
new_text - văn bản mới.

Các biến được đưa vào chương trình, ở đây tài liệu chuyển hướng lệnh thay thế toàn cục, lệnh ghi và lệnh kết thúc sang lệnh ed. Chạy chương trình ch.text. Nhận màn hình sau:

$ch.text Nhập bản ghi nhớ tên tập tin Nhập chính xác văn bản cần thay đổi. John thân mến: Nhập chính xác văn bản mới để thay thế văn bản trên. Đối với những gì nó có thể quan tâm: bản ghi nhớ $ mèo Đối với những gì nó có thể quan tâm: $

9.3.4. Mã hoàn thành

Số đông lệnh shell trả về mã cho biết lệnh đã hoàn thành thành công hay chưa. Nếu giá trị trả về là 0 (không), thì lệnh đã hoàn thành thành công. Mã trả về không được in tự động nhưng có thể được lấy dưới dạng giá trị của tham số shell $? đặc biệt.

9.3.4.1. Kiểm tra mã hoàn thành

Sau khi chạy lệnh tương tác, bạn có thể thấy mã thoát khi gõ:

Hãy xem xét ví dụ sau:

$ cat xin chào Đây là tập tin xin chào. $tiếng vang$? 0$ mèo xin chào mèo: không mở được xin chào $ echo $? $2

Trong trường hợp đầu tiên, tệp hi tồn tại trong thư mục của bạn và bạn có quyền đọc. Sử dụng lệnh cat bạn có thể in nội dung của tập tin. Kết quả của lệnh cat là mã trả về 0, bạn sẽ nhận được mã này bằng cách chỉ định tham số $?. Trong trường hợp thứ hai, tệp không tồn tại hoặc bạn không có quyền đọc. lệnh mèo in thông báo chẩn đoán và trả về mã 2.

Chương trình shell thoát bình thường khi lệnh cuối cùng trong tệp được thực thi. Tuy nhiên, bạn có thể sử dụng lệnh exit để kết thúc chương trình. Quan trọng hơn, bạn có thể sử dụng lệnh exit để lấy mã trả về chương trình shell.

9.3.5. Chu kỳ

Câu lệnh vòng lặp for và while cho phép bạn thực thi một lệnh hoặc một chuỗi lệnh nhiều lần.

9.3.5.1. cho tuyên bố

Câu lệnh for thực thi một chuỗi lệnh cho từng phần tử của danh sách. Nó có định dạng:

Đối với biến trong a_list_of_values LÀM lệnh_1 lệnh_2 . . . lệnh cuối cùng xong

Đối với mỗi lần lặp của vòng lặp, phần tử tiếp theo của danh sách được gán cho biến được đưa ra trong câu lệnh for. Biến này có thể được tham chiếu ở bất kỳ đâu trong các lệnh trong câu lệnh do. Khi xây dựng từng phần lệnh, bạn cần đảm bảo rằng với mỗi phần thực hiện đều có phần thực hiện tương ứng ở cuối vòng lặp.

Biến có thể có bất kỳ tên nào. Ví dụ: nếu biến của bạn có tên là var thì tham chiếu đến $var trong danh sách lệnh sẽ làm cho giá trị đó có sẵn. Nếu toán tử in bị bỏ qua thì giá trị của var sẽ là tập hợp các đối số được đưa ra trong lệnh và có sẵn trong tham số đặc biệt$*. Danh sách các lệnh giữa từ khóa do và done sẽ được thực thi cho từng giá trị.

Khi các lệnh được thực thi cho phần tử cuối cùng của danh sách, chương trình sẽ thực hiện xong dòng bên dưới.

9.3.5.2. câu lệnh while

Toán tử vòng lặp while sử dụng 2 nhóm lệnh. Nó sẽ thực thi chuỗi lệnh trong nhóm thứ hai (danh sách do ... done) cho đến khi lệnh cuối cùng trong nhóm đầu tiên (danh sách while) trả về true, nghĩa là biểu thức sau do có thể được thực thi.

Định dạng chung của câu lệnh vòng lặp while là:

Trong khi lệnh_1 . . . lệnh cuối cùng LÀM lệnh_1 . . . lệnh cuối cùng xong

Ví dụ: chương trình enter.name sử dụng vòng lặp while để nhập danh sách tên vào một tệp. Chương trình bao gồm các dòng lệnh sau:

$ mèo nhập.name trong khi đọc x làm echo $x>>xfile xong $

Thực hiện một số bổ sung, chúng tôi nhận được chương trình tiếp theo:

$ mèo nhập.name echo Vui lòng nhập tên của mỗi người và hơn một echo Xin vui lòng kết thúc danh sách tên có chữ a<^d>while read x do echo $x>>xfile done echo xfile chứa các tên sau: cat xfile $

Lưu ý rằng sau khi vòng lặp hoàn thành, chương trình sẽ thực hiện các lệnh bên dưới.

Hai lệnh echo đầu tiên sử dụng các ký tự đặc biệt nên bạn phải sử dụng dấu ngoặc kép để thoát khỏi ý nghĩa đặc biệt. Màn hình sau đây hiển thị đầu ra của enter.name:

$enter.name Vui lòng nhập tên của từng người và hơn một Vui lòng kết thúc danh sách tên bằng một<^d>Mary Lou Janice <^d>xfile chứa các tên sau: Mary Lou Janice $

Sau khi vòng lặp hoàn tất, chương trình sẽ in ra tất cả các tên có trong xfile.

9.3.6. Sử dụng/dev/null

Hệ thống tệp có tệp /dev/null nơi bạn có thể lưu trữ kết quả đầu ra không mong muốn. Ví dụ: nếu bạn chỉ cần nhập lệnh who, hệ thống sẽ trả lời ai đang làm việc trên hệ thống. Nếu bạn chuyển hướng đầu ra của lệnh này sang/dev/null:

Ai > /dev/null

thì bạn sẽ không nhận được câu trả lời.

9.3.7. Câu điều kiện

câu lệnh nếu...thì

Lệnh if yêu cầu chương trình shell thực thi chuỗi lệnh sau đó nếu lệnh cuối cùng trong danh sách lệnh của câu lệnh if hoàn thành thành công. Nếu cấu trúc kết thúc bằng từ khóa fi.

Định dạng chung của cấu trúc if là:

Nếu như lệnh_1 . . . lệnh cuối cùng sau đó lệnh_1 . . . lệnh cuối cùng fi

Ví dụ: chương trình shell tìm kiếm thể hiện việc sử dụng cấu trúc if ... then. Chương trình tìm kiếm sử dụng lệnh grep để tìm kiếm một từ trong tệp. Nếu grep thành công, chương trình sẽ hiển thị từ tìm thấy. Màn hình sẽ trông như thế này:

$ tìm kiếm mèo echo Nhập từ và tên tập tin. đọc tệp từ nếu grep $word $file thì echo $word nằm trong $file fi $

Chương trình này hiển thị đầu ra của lệnh grep. Nếu bạn muốn lưu trữ phản hồi của hệ thống đối với lệnh grep trong chương trình của mình, hãy sử dụng tệp /dev/null, thay đổi dòng lệnh if thành như sau:

Nếu grep $word $file > /dev/null

Bây giờ hãy chạy lệnh tìm kiếm. Nó sẽ chỉ phản hồi với thông báo được chỉ định sau lệnh echo.

Cấu trúc if ... then ... else có thể thực thi một tập lệnh thay thế sau else nếu chuỗi if sai. Định dạng của cấu trúc này như sau:

Nếu như lệnh_1 . . . lệnh cuối cùng .linthen lệnh_1 . . . lệnh cuối cùng khác lệnh_1 . . . lệnh cuối cùng fi

Với cấu trúc này, bạn có thể cải thiện chương trình tìm kiếm để nó cho bạn biết cả từ được tìm thấy và từ không được tìm thấy. Trong trường hợp này, chương trình tìm kiếm sẽ trông như thế này:

$ tìm kiếm mèo echo Nhập từ và tên tập tin. đọc tệp word nếu grep $word $file > /dev/null thì echo $word nằm trong $file nếu không echo $word KHÔNG có trong $file fi $

lệnh kiểm tra

Lệnh test được sử dụng để tổ chức một vòng lặp. Nó kiểm tra các điều kiện nhất định về sự đúng đắn và rất hữu ích cho việc tổ chức các cấu trúc có điều kiện. Nếu điều kiện đúng thì vòng lặp sẽ tiếp tục. Nếu điều kiện sai thì vòng lặp sẽ kết thúc và lệnh tiếp theo sẽ được thực thi. Một số ví dụ về việc sử dụng lệnh kiểm tra:

Kiểm tra tập tin -r đúng nếu tệp tồn tại và có thể đọc được; kiểm tra tập tin -w đúng nếu tệp tồn tại và có thể ghi được; kiểm tra tập tin -x đúng nếu tệp tồn tại và có thể thực thi được; tập tin kiểm tra -s đúng nếu tệp tồn tại và có ít nhất một ký tự; kiểm tra var1 -eq var2 đúng nếu var1 bằng var2; kiểm tra var1 -ne var2 đúng nếu var1 không bằng var2.

Ví dụ. Hãy tạo một chương trình shell để di chuyển tất cả các tệp thực thi từ thư mục hiện tại sang thư mục bin của bạn. Để thực hiện việc này, chúng tôi sẽ sử dụng lệnh test -x để chọn các tệp thực thi. Chương trình mv.file sẽ trông như thế này:

$ cat mv.file gõ echo vào đường dẫn thư mục đọc đường dẫn cho file do if test -x $file then mv $file $path/$file fi done $

Cấu trúc case ... esac cho phép bạn chọn một trong nhiều mẫu và sau đó thực thi danh sách các lệnh cho mẫu đó. Biểu thức mẫu phải bắt đầu bằng từ khóa in và phải đặt dấu ngoặc đơn bên phải sau ký tự cuối cùng của mỗi mẫu. Chuỗi lệnh cho mỗi mẫu kết thúc bằng hai ký tự;;. Cấu trúc case phải được kết thúc bằng từ khóa esc.

Dạng chung của cấu trúc trường hợp là:

Trường hợp từ TRONG mẫu1) dòng lệnh 1 . . . dòng lệnh cuối cùng ;;mẫu2) dòng lệnh 1 . . dòng lệnh cuối cùng ;;mẫu3) dòng lệnh 1 . . dòng lệnh cuối cùng ;; *)dòng lệnh 1 . . dòng lệnh cuối cùng ;;esac

Cấu trúc trường hợp cố gắng tìm một từ có mẫu mẫu trong phần mẫu đầu tiên. Nếu tìm kiếm thành công, chương trình thực thi các dòng lệnh sau mẫu đầu tiên cho đến khi đạt được ký tự tương ứng;;.

Nếu không tìm thấy mẫu đầu tiên thì việc chuyển sang mẫu thứ hai sẽ được thực hiện. Nếu tìm thấy bất kỳ mẫu nào, chương trình sẽ không xem xét các mẫu còn lại mà chuyển sang lệnh sau esc. * được sử dụng làm mẫu để tìm kiếm bất kỳ từ nào và do đó cung cấp cho bạn một tập hợp các lệnh sẽ được thực thi nếu không tìm thấy mẫu nào khác. Do đó, mẫu dấu hoa thị (*) được đặt làm mẫu cuối cùng trong cấu trúc trường hợp để các mẫu khác được kiểm tra trước. Điều này sẽ giúp bạn phát hiện đầu vào không chính xác và không mong muốn.

Mẫu có thể sử dụng siêu ký tự *, ?, . Điều này mang lại sự linh hoạt cho chương trình.

Hãy xem một ví dụ. Chương trình set.term đặt biến TERM theo loại thiết bị đầu cuối bạn đang sử dụng. Dòng lệnh sau được sử dụng:

TERM=terminal_name

Mẫu * là mẫu cuối cùng trong danh sách các mẫu. Nó đưa ra một thông báo cảnh báo rằng không có mẫu phù hợp cho loại thiết bị đầu cuối được chỉ định và cho phép bạn hoàn thành cấu trúc trường hợp.

$ cat set.term echo Nếu bạn có loại TTY 4420 trong 4420 echo Nếu bạn có loại TTY 5410 trong 5410 echo Nếu bạn có loại TTY 5420 trong 5420, hãy đọc thuật ngữ trường hợp trong 4420) TERM-T4 ;; 5410) ĐIỀU KHOẢN-T5 ;; 5420) ĐIỀU KHOẢN-T7 ;; *) echo không phải là loại thiết bị đầu cuối chính xác ;; esac xuất TERM echo kết thúc chương trình $

9.3.8. Chuyển giao quyền kiểm soát vô điều kiện

Lệnh break dừng vô điều kiện việc thực thi bất kỳ vòng lặp nào mà nó gặp phải và chuyển quyền điều khiển sang lệnh theo các từ khóa done, fi hoặc esc.

Trong ví dụ về chương trình set.term trước, bạn có thể sử dụng lệnh break thay vì echo để thoát khỏi chương trình, như trong ví dụ sau:

$ cat set.term echo Nếu bạn có loại TTY 4420 trong 4420 echo Nếu bạn có loại TTY 5410 trong 5410 echo Nếu bạn có loại TTY 5420 trong 5420, hãy đọc thuật ngữ trường hợp trong 4420) TERM-T4 ;; 5410) ĐIỀU KHOẢN-T5 ;; 5420) ĐIỀU KHOẢN-T7 ;; *) phá vỡ ;; esac xuất TERM echo kết thúc chương trình $

Lệnh continue sẽ khiến chương trình ngay lập tức chuyển sang lần lặp tiếp theo của vòng lặp while hoặc for mà không thực hiện các lệnh còn lại trong vòng lặp.

  • Hướng dẫn

Tại sao và bài viết dành cho ai?

Ban đầu, đây là lời nhắc nhở dành cho những sinh viên mới bắt đầu làm việc với các hệ thống giống Unix. Nói cách khác, bài viết dành cho những người chưa có kinh nghiệm làm việc với dòng lệnh Unix trước đây, nhưng vì lý do này hay lý do khác muốn hoặc cần học cách tương tác hiệu quả với nó.

Sẽ không có việc kể lại mana (tài liệu) và bài viết không hủy bỏ hoặc thay thế việc đọc chúng dưới bất kỳ hình thức nào. Thay vào đó, tôi sẽ nói về những điều chính (lệnh, kỹ thuật và nguyên tắc) mà bạn cần hiểu ngay từ đầu khi bắt đầu làm việc trong unix shell để công việc có hiệu quả và thú vị.

Bài viết liên quan đến các môi trường giống unix chính thức, với một shell đầy đủ chức năng (tốt nhất là zsh hoặc bash) và một phạm vi khá rộng của chương trình tiêu chuẩn.

vỏ là gì

Shell (shell, hay còn gọi là “dòng lệnh”, hay còn gọi là CLI, còn gọi là “bảng điều khiển”, hay còn gọi là “thiết bị đầu cuối”, hay còn gọi là “cửa sổ màu đen có chữ màu trắng”) là giao diện văn bản giao tiếp với hệ điều hành(à, nói đúng ra thì đây là chương trình, cung cấp giao diện như vậy, nhưng hiện tại sự khác biệt này không đáng kể).

Nói chung, công việc thông qua shell trông như thế này: người dùng (tức là bạn) nhập lệnh từ bàn phím, nhấn Enter, hệ thống thực thi lệnh, ghi kết quả thực thi ra màn hình và lại chờ đầu vào lệnh tiếp theo.

Chế độ xem điển hình vỏ sò:

Shell là cách chính để tương tác với tất cả các hệ thống máy chủ giống Unix.

Hệ thống dòng lệnh được tìm thấy ở đâu?

Trường hợp Unix shell có thể đang đợi bạn, các tùy chọn phổ biến:
  • MacOS (bash);
  • truy cập từ xa vào máy chủ để làm việc hoặc cho dự án web cá nhân;
  • máy chủ tập tin gia đình có quyền truy cập từ xa;
  • Ubuntu, PC-BSD trên máy tính xách tay/máy tính để bàn - hệ thống kiểu unix ngày nay rất dễ cài đặt và sử dụng.

Những vấn đề nào là hợp lý để giải quyết bằng shell?

Nhiệm vụ tự nhiên mà vỏ phù hợp, hữu ích và không thể thiếu:
  • công việc tương tác trong thiết bị đầu cuối:
    • thực hiện biên dịch, chạy các công việc thông qua make;
    • so sánh các tập tin văn bản;
    • phân tích dữ liệu đặc biệt nhanh (số lượng IP duy nhất trong nhật ký, phân phối bản ghi theo giờ/phút, v.v.);
    • hành động hàng loạt một lần (tiêu diệt nhiều quy trình; nếu bạn làm việc với hệ thống kiểm soát phiên bản, hãy đảo ngược hoặc giải quyết một loạt tệp);
    • chẩn đoán những gì đang xảy ra trong hệ thống (semaphore, khóa, quy trình, bộ mô tả, dung lượng ổ đĩa, v.v.);
  • kịch bản:
    • các tập lệnh cài đặt mà bạn không thể dựa vào sự hiện diện của các trình thông dịch khác - điều này không dành cho người mới bắt đầu;
    • các chức năng tùy chỉnh shell tương tác (ảnh hưởng đến lời mời, thay đổi thư mục, cài đặt các biến môi trường) cũng không dành cho người mới bắt đầu;
    • các tập lệnh một lần như mã hóa tập tin hàng loạt;
    • makefiles.

Chắc chắn là những bước đầu tiên

Hãy bắt đầu: đăng nhập và đăng xuất

Hãy chắc chắn rằng bạn biết chính xác cách khởi động shell và cách thoát khỏi nó.

Nếu bạn đang làm việc trên máy có cài đặt Ubuntu, bạn cần khởi chạy chương trình Terminal. Khi hoàn tất, bạn chỉ cần đóng cửa sổ lại.

Trên MacOS - cũng khởi chạy Terminal.

Để truy cập máy chủ từ xa, hãy sử dụng ssh (nếu bạn có MacOS, Ubuntu hoặc hệ thống giống Unix khác cục bộ) hoặc PuTTY (nếu bạn có Windows).

Tôi là ai, tôi ở đâu?

Chạy các lệnh sau:
  • tên máy chủ - hiển thị tên của máy (máy chủ) bạn hiện đang sử dụng;
  • whoami - hiển thị thông tin đăng nhập của bạn (tên của bạn trong hệ thống);
  • tree -d / |less - biểu diễn đồ họa giả của cây thư mục trên máy; thoát khỏi cuộn - q ;
  • pwd - hiển thị thư mục bạn đang ở; trên dòng lệnh bạn không thể “cứ như thế”, bạn phải ở trong thư mục nào đó (=thư mục hiện tại, thư mục làm việc). Thư mục làm việc hiện tại có thể được hiển thị trong lời nhắc của bạn.
  • ls - danh sách các tập tin trong thư mục hiện tại; ls /home - danh sách các tập tin trong thư mục được chỉ định;

Lịch sử lệnh (lịch sử)

Một thuộc tính quan trọng của dòng lệnh chính thức là lịch sử lệnh.

Chạy một số lệnh: tên máy chủ, ls, pwd, whoami. Bây giờ hãy nhấn phím lên. Lệnh trước đó xuất hiện trong dòng đầu vào. Bạn có thể sử dụng phím lên và xuống để di chuyển tiến và lùi trong lịch sử. Khi bạn đến tên máy chủ, nhấn Enter - lệnh sẽ được thực thi lại.

Các lệnh từ lịch sử không chỉ có thể được thực thi nhiều lần mà còn có thể được chỉnh sửa. Cuộn qua lịch sử đến lệnh ls, thêm công tắc -l vào đó (hóa ra ls -l , có khoảng trắng trước dấu trừ, nhưng không có dấu cách sau). Nhấn Enter - lệnh sửa đổi sẽ được thực thi.

Cuộn qua lịch sử, chỉnh sửa và thực hiện lại lệnh là những thao tác thường gặp nhất khi làm việc trên dòng lệnh nên hãy làm quen dần nhé.

Sao chép dán

Dòng lệnh rất tập trung vào văn bản: các lệnh là văn bản, dữ liệu đầu vào của hầu hết các chương trình tiêu chuẩn là văn bản và đầu ra thường là văn bản.

Điều tuyệt vời về văn bản là nó có thể được sao chép và dán, và điều này cũng đúng trên dòng lệnh.

Hãy thử lệnh date +"%y-%m-%d, %A"
Bạn nhập hoàn toàn bằng tay hay chép từ bài viết? Hãy chắc chắn rằng bạn có thể sao chép nó, dán nó vào terminal và thực thi nó.

Khi bạn đã học cách sử dụng man, hãy đảm bảo bạn có thể sao chép và chạy các lệnh mẫu từ trợ giúp. Để kiểm tra, hãy tra cứu phần VÍ DỤ trong trợ giúp chương trình ngày tháng, sao chép và chạy ví dụ đầu tiên được cung cấp (chỉ trong trường hợp: ký hiệu đô la không phải là một phần của lệnh, đây là hình ảnh tượng trưng của lời nhắc đầu vào).

Cách sao chép chính xác văn bản từ thiết bị đầu cuối và dán nó vào thiết bị đầu cuối tùy thuộc vào hệ thống của bạn và cài đặt của nó, vì vậy hãy đưa ra hướng dẫn phổ quát Thật không may, nó sẽ không hoạt động. Trên Ubuntu, hãy thử cách này: sao chép - chỉ cần chọn bằng chuột, dán - nút chuột giữa. Nếu nó không hoạt động hoặc nếu bạn có một hệ thống khác, hãy tìm trên Internet hoặc hỏi những người bạn có kinh nghiệm hơn.

Phím và tùy chọn

Khi tìm hiểu lịch sử của các lệnh, bạn đã thấy rằng lệnh ls có ít nhất hai tùy chọn. Nếu bạn gọi nó như vậy, nó sẽ đưa ra một danh sách đơn giản:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Nếu bạn thêm khóa chuyển -l, thông tin chi tiết sẽ được hiển thị cho từng tệp:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l tổng 332 -rw-rw-r-- 1 akira akira 198 13 tháng 2 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 tháng 2 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Ngày 13 tháng 2 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Ngày 13 tháng 2 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 13 tháng 2 11:35 shell-survival-quide.pdf
Đây là một tình huống rất điển hình: nếu bạn thêm các công cụ sửa đổi đặc biệt (phím, tùy chọn, tham số) vào lệnh gọi, hành vi của lệnh sẽ thay đổi. So sánh: cây / và cây -d/, tên máy chủ và tên máy chủ -f.

Ngoài ra, các lệnh có thể lấy tên file, tên thư mục hoặc đơn giản là chuỗi văn bản. Thử:

Ls -ld /home ls -l /home grep root /etc/passwd

người đàn ông

man - Trợ giúp với các lệnh và chương trình có sẵn trên máy của bạn, cũng như các cuộc gọi hệ thống và thư viện C tiêu chuẩn.

Hãy thử: man grep , man atoi , man chdir , man man .

Việc cuộn tiến và lùi được thực hiện bằng các nút “lên”, “xuống”, “PageUp”, “PageDown”, thoát khỏi chế độ xem trợ giúp được thực hiện bằng nút q. Tìm kiếm văn bản cụ thể trong bài viết trợ giúp: nhấn / (dấu gạch chéo lên), nhập văn bản cần tìm kiếm, nhấn Enter. Di chuyển đến lần xuất hiện tiếp theo - phím n.

Tất cả các bài viết trợ giúp được chia thành các danh mục. Quan trọng nhất:

Cần chỉ rõ loại chứng chỉ nào sẽ được thể hiện trong trường hợp trùng tên. Ví dụ: man 3 printf mô tả một hàm từ thư viện chuẩn C và man 1 printf mô tả chương trình điều khiển có cùng tên.

Bạn có thể xem danh sách tất cả các bài viết trợ giúp có sẵn trên máy của mình bằng lệnh man -k. (dấu chấm cũng là một phần của komada).

ít hơn

Khi ở trong một cửa sổ terminal nhỏ, bạn cần xem rất Văn bản dài(nội dung của một số tệp, một trang dài, v.v.), họ sử dụng các chương trình “máy nhắn tin” đặc biệt (từ trang từ, tức là trình lật trang). Thanh cuộn phổ biến nhất thì ít hơn và nó là thứ cung cấp cho bạn khả năng cuộn khi bạn đọc các trang man.

Hãy thử và so sánh hành vi:

Mèo /etc/bash.bashrc mèo /etc/bash.bashrc |less

Bạn có thể chuyển file trực tiếp sang máy nhắn tin trong phần thông số:

Ít hơn /etc/bash.bashrc

Cuộn lên và xuống - nút "lên", "xuống", "PageUp", "PageDown", thoát - nút q. Tìm kiếm văn bản cụ thể: nhấn / (dấu gạch chéo tiến), nhập văn bản cần tìm, nhấn Enter. Di chuyển đến lần xuất hiện tiếp theo - phím n. (Bạn có nhận ra những hướng dẫn về con người không? Không có gì ngạc nhiên, less cũng được sử dụng để thể hiện sự giúp đỡ.)

Quyền

Bất kỳ tệp hoặc thư mục nào đều được liên kết với một tập hợp các “quyền”: quyền đọc tệp, quyền ghi vào tệp, quyền thực thi tệp. Tất cả người dùng được chia thành ba loại: chủ sở hữu tệp, nhóm chủ sở hữu tệp và tất cả những người dùng khác.

Bạn có thể xem quyền truy cập tệp bằng ls -l . Ví dụ:

> ls -l Makefile -rw-r--r-- 1 akira sinh viên 198 13/02 11:48 Makefile
Đầu ra này có nghĩa là chủ sở hữu (akira) có thể đọc và ghi tệp, nhóm (sinh viên) chỉ có thể đọc và tất cả người dùng khác cũng chỉ có thể đọc.

Nếu bạn nhận được thông báo từ chối cấp phép khi đang làm việc, điều này có nghĩa là bạn không có đủ quyền đối với đối tượng mà bạn muốn làm việc cùng.

Đọc thêm trong man chmod.

STDIN, STDOUT, băng tải (ống)

Có 3 luồng dữ liệu tiêu chuẩn liên quan đến mỗi chương trình thực thi: luồng dữ liệu đầu vào STDIN, luồng dữ liệu đầu ra STDOUT, luồng dữ liệu đầu ra lỗi STDERR.

Chạy chương trình wc, nhập văn bản Chúc một ngày tốt lành, nhấn Enter, nhập văn bản chúc một ngày tốt lành, nhấn Enter, nhấn Ctrl+d. Chương trình wc sẽ hiển thị số liệu thống kê về số lượng chữ cái, từ và dòng trong văn bản và phần cuối của bạn:

> wc chúc một ngày tốt lành hôm nay chúc một ngày tốt lành 2 5 24
Trong trường hợp này, bạn đã cung cấp văn bản hai dòng cho STDIN của chương trình và nhận được ba số trong STDOUT.

Bây giờ hãy chạy lệnh head -n3 /etc/passwd , nó sẽ trông giống như thế này:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
Trong trường hợp này, chương trình chính không đọc bất kỳ thứ gì từ STDIN mà ghi ba dòng vào STDOUT.

Bạn có thể tưởng tượng nó theo cách này: chương trình là một đường dẫn trong đó STDIN chảy vào và STDOUT chảy ra.

Tài sản quan trọng nhất Dòng lệnh Unix là các chương trình “ống” có thể được kết nối với nhau: đầu ra (STDOUT) của một chương trình có thể được chuyển dưới dạng dữ liệu đầu vào (STDIN) sang một chương trình khác.

Việc xây dựng các chương trình được kết nối như vậy được gọi là đường ống trong tiếng Anh hoặc băng tải hoặc đường ống trong tiếng Nga.

Việc kết hợp các chương trình thành một đường dẫn được thực hiện bằng ký hiệu | (thanh dọc)

Chạy lệnh head -n3 /etc/passwd |wc , nó sẽ trông giống như thế này:

> head -n3 /etc/passwd |wc 3 3 117
Đây là những gì đã xảy ra: chương trình head xuất ra ba dòng văn bản ở dạng STDOUT, ngay lập tức đi đến đầu vào của chương trình wc, chương trình này sẽ đếm số ký tự, từ và dòng trong văn bản kết quả.

Bạn có thể kết hợp bao nhiêu chương trình tùy thích vào một đường dẫn. Ví dụ: bạn có thể thêm một chương trình wc khác vào quy trình trước đó, chương trình này sẽ đếm xem có bao nhiêu từ và chữ cái trong đầu ra của wc đầu tiên:

> head -n3 /etc/passwd |wc |wc 1 3 24

Tạo đường ống (pipes) là một nhiệm vụ rất phổ biến khi làm việc trên dòng lệnh. Để biết ví dụ về cách thực hiện điều này trong thực tế, hãy đọc phần “Tạo quy trình một lớp”.

Chuyển hướng I/O

Đầu ra (STDOUT) của một chương trình không chỉ có thể được chuyển sang chương trình khác thông qua một đường dẫn mà còn có thể được ghi đơn giản vào một tệp. Việc chuyển hướng này được thực hiện bằng cách sử dụng > (dấu lớn hơn):

Ngày > /tmp/today.txt
Kết quả của việc thực thi lệnh này là tệp /tmp/today.txt sẽ xuất hiện trên đĩa. Xem nội dung của nó bằng cat /tmp/today.txt

Nếu một tập tin có cùng tên đã tồn tại thì nội dung cũ của nó sẽ bị hủy. Nếu tập tin không tồn tại, nó sẽ được tạo. Thư mục chứa tệp được tạo phải tồn tại trước khi lệnh được thực thi.

Nếu bạn không muốn ghi đè lên một tệp mà muốn thêm đầu ra vào cuối tệp, hãy sử dụng >> :

Ngày >> /tmp/today.txt
Kiểm tra những gì hiện được ghi trong tập tin.

Ngoài ra, bạn có thể chuyển bất kỳ tệp nào vào chương trình thay vì STDIN. Thử:

wc

Phải làm gì khi có điều gì đó không rõ ràng

Nếu bạn gặp phải hành vi hệ thống mà bạn không hiểu hoặc muốn đạt được một kết quả nhất định nhưng không biết cách thực hiện, tôi khuyên bạn nên tiếp tục theo thứ tự sau (nhân tiện, điều này không chỉ áp dụng cho shell):
  • Hãy đặt câu hỏi hoặc nhiệm vụ một cách rõ ràng nhất có thể - không có gì khó hơn việc giải “điều mà tôi không biết là gì”;
  • hãy nhớ nếu bạn đã gặp phải vấn đề tương tự hoặc tương tự - trong trường hợp này, bạn nên thử giải pháp đã hiệu quả lần trước;
  • đọc các trang man thích hợp (nếu bạn hiểu trang man nào phù hợp trong trường hợp của bạn) - có thể bạn sẽ tìm thấy các ví dụ phù hợp về cách sử dụng lệnh, các tùy chọn cần thiết hoặc liên kết đến các lệnh khác;
  • Hãy suy nghĩ: có thể thay đổi nhiệm vụ một chút không? - có lẽ, bằng cách thay đổi một chút các điều kiện, bạn sẽ gặp phải một vấn đề mà bạn đã biết cách giải quyết;
  • đặt câu hỏi được xây dựng rõ ràng của bạn trong công cụ tìm kiếm - có thể tìm thấy câu trả lời trên Stack Overflow hoặc các trang web khác;
Nếu những cách trên không giúp ích được gì, hãy tìm lời khuyên từ giáo viên, đồng nghiệp hoặc bạn bè có kinh nghiệm. Và đừng ngại đặt những câu hỏi “ngu ngốc” - không biết thì xấu hổ, không hỏi thì xấu hổ.

Nếu bạn giải quyết một vấn đề khó khăn (tự mình giải quyết, với sự trợ giúp của Internet hoặc người khác), hãy viết ra giải pháp của bạn phòng trường hợp vấn đề tương tự lại xảy ra với bạn hoặc bạn bè của bạn. Bạn có thể ghi lại nó trong một tệp văn bản đơn giản, trong Evernote hoặc xuất bản nó trên mạng xã hội.

Các phương pháp làm việc

Sao chép và dán- từ các trang man, từ các bài viết trên StackOverflow, v.v. Dòng lệnh bao gồm văn bản, hãy tận dụng lợi thế này: sao chép và sử dụng các lệnh ví dụ, viết ra những phát hiện thành công làm vật kỷ niệm, xuất bản chúng trên Twitter và blog.

Kéo lệnh trước đó từ lịch sử, thêm lệnh khác vào đường dẫn, chạy, lặp lại.Cm. Xem thêm phần “Tạo đường dẫn một lớp”.

Các lệnh cơ bản

  • đổi sang thư mục khác: cd ;
  • xem nội dung các file: cat, less, head, tail;
  • thao tác với tập tin: cp, mv, rm;
  • xem nội dung thư mục: ls , ls -l , ls -lS ;
  • cấu trúc thư mục: tree , tree -d (thư mục có thể được truyền dưới dạng tham số);
  • tìm kiếm tập tin: tìm . -tên ... ;

phân tích

  • wc, wc -l;
  • sắp xếp -k - sắp xếp theo trường được chỉ định;
  • sắp xếp -n - sắp xếp số;
  • khác - so sánh tập tin;
  • grep , grep -v , grep -w , grep "\ " , grep -E - tìm kiếm văn bản;
  • uniq , uniq -c - duy nhất chuỗi;
  • awk - trong tùy chọn awk "(print $1)", chỉ để lại trường đầu tiên từ mỗi dòng, $1 có thể được thay đổi thành $2, $3, v.v.;

Chẩn đoán hệ thống

  • ps axuww - thông tin về các tiến trình (chương trình đang chạy) đang chạy trên máy;
  • top - xem tương tác các quy trình sử dụng nhiều tài nguyên nhất;
  • df - dung lượng đĩa đã sử dụng và trống;
  • du - tổng kích thước của các tệp trong thư mục (đệ quy với các thư mục con);
  • strace , ktrace - hệ thống gọi quy trình là gì;
  • lsof - tập tin mà tiến trình sử dụng;
  • netstat -na, netstat -nap - cổng và ổ cắm nào đang mở trong hệ thống.

Bạn có thể không có một số chương trình, chúng cần được cài đặt thêm. Ngoài ra, một số tùy chọn của các chương trình này chỉ dành cho người dùng có đặc quyền (root).

Thực hiện hàng loạt và bán tự động

Lúc đầu, hãy bỏ qua phần này; bạn sẽ cần những lệnh và cấu trúc này khi bạn sử dụng tập lệnh shell đơn giản.
  • thử - kiểm tra điều kiện;
  • while đọc - lặp từng dòng STDIN ;
  • xargs - thay thế các chuỗi từ STDIN thành các tham số của chương trình đã chỉ định;
  • seq - tạo chuỗi số tự nhiên;
  • () - kết hợp đầu ra của một số lệnh;
  • ; - làm việc này đến việc khác;
  • && - thực thi nếu lệnh đầu tiên hoàn thành thành công;
  • || - thực thi nếu lệnh đầu tiên thất bại;
  • tee - sao chép đầu ra chương trình thành STDOUT và vào một tệp trên đĩa.

Điều khoản khác

  • ngày - ngày hiện tại;
  • cuộn tròn - tải xuống tài liệu từ url đã chỉ định và ghi kết quả vào STDOUT;
  • touch - cập nhật ngày sửa đổi tập tin;
  • kill - gửi tín hiệu đến quá trình;
  • true - không làm gì cả, trả về true, hữu ích cho việc tổ chức các vòng lặp vĩnh cửu;
  • sudo - thực thi lệnh với quyền root "a.

Tạo một đường dẫn một lớp

Hãy xem một ví dụ về một tác vụ thực tế: chúng ta cần loại bỏ tất cả các quy trình máy chủ tác vụ-6 đang chạy với tư cách là người dùng hiện tại.

Bước 1.
Hiểu chương trình nào tạo ra dữ liệu gần đúng cần thiết, ngay cả khi không ở dạng thuần túy. Đối với nhiệm vụ của chúng tôi, cần có danh sách tất cả các quy trình trong hệ thống: ps axuww. Phóng.

Bước 2.
Nhìn vào dữ liệu nhận được bằng mắt, đưa ra bộ lọc sẽ loại bỏ một số dữ liệu không cần thiết. Đây thường là grep hoặc grep -v . Sử dụng phím “Lên” để lấy lệnh trước đó ra khỏi lịch sử, gán bộ lọc được phát minh cho lệnh đó và chạy lệnh đó.

Ps axuww |grep `whoami`
- chỉ các quy trình của người dùng hiện tại.

Bước 3.
Lặp lại bước 2 cho đến khi bạn có được dữ liệu sạch mà bạn cần.

"
- tất cả các quy trình có tên được yêu cầu (cộng với, có lẽ, các quy trình bổ sung như vim task-6-server.c, v.v.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less
- chỉ xử lý với tên được yêu cầu

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(print $2)"

Pid của các quy trình cần thiết, bước 3 đã hoàn thành

Bước 4.
Áp dụng một trình xử lý cuối cùng phù hợp. Sử dụng phím “Lên”, chúng tôi rút lệnh trước đó khỏi lịch sử và thêm quá trình xử lý sẽ hoàn thành giải pháp cho vấn đề:

  • |wc -l để đếm số lượng tiến trình;
  • >pids để ghi pids vào một tập tin;
  • |xargs kill -9 quá trình tiêu diệt.

Nhiệm vụ đào tạo

Bạn muốn thực hành các kỹ năng mới? Hãy thử các tác vụ sau:
  • lấy danh sách tất cả các tập tin và thư mục trong thư mục chính của bạn;
  • lấy danh sách tất cả các bài viết của con người từ danh mục 2 (cuộc gọi hệ thống);
  • đếm số lần từ grep xuất hiện trong trang man của chương trình grep;
  • đếm xem có bao nhiêu tiến trình hiện đang chạy bằng root;
  • tìm lệnh nào xuất hiện trong số lượng danh mục trợ giúp tối đa (man);
  • đếm số lần từ var xuất hiện trên trang ya.ru.
Gợi ý: bạn sẽ cần find , grep -o , awk "(print $1)" , biểu thức chính quy trong grep , Curl -s .

Học gì tiếp theo?

Nếu bạn bắt đầu thích dòng lệnh, đừng dừng lại, hãy tiếp tục cải thiện kỹ năng của mình.

Dưới đây là một số chương trình chắc chắn sẽ có ích nếu bạn sống bằng dòng lệnh:

  • tìm với các tùy chọn phức tạp
  • thích hợp
  • định vị
  • telnet
  • mèo mạng
  • tcpdump
  • rsync
  • màn hình
  • zgrep, zless
  • visudo
  • crontab -e
  • gửi thư
Ngoài ra, theo thời gian, bạn nên thành thạo một số loại ngôn ngữ kịch bản, chẳng hạn như Perl hoặc Python, hoặc thậm chí cả hai.

Ai cần cái này?

Ngày nay việc học dòng lệnh và shell script có đáng không? Chắc chắn có giá trị nó. Tôi sẽ chỉ đưa ra một vài ví dụ về yêu cầu của Facebook đối với những ứng viên muốn xin việc tại FB.