Cách tạo file sh trong Linux
Bài viết này giới thiệu các bạn về cách lập trình bash shell siêu cơ bản trên hệ điều hành Linux, giới thiệu với cách bạn về chức năng và cách sử dụng của lập trình bash shell để các bạn có thể tự tìm hiểu và tự học Linux cơ bản dễ dàng hơn. Show Shell script là một chương trình được sử dụng cho nhiều mục đích khác nhau, chẳng hạn như thực thi lệnh shell, chạy nhiều lệnh cùng nhau, tùy chỉnh các tác vụ quản trị, thực hiện tự động hóa,... mà bạn thường xuyên thực hiện trên máy tính của mình. Shell script cho phép chúng ta lập trình các lệnh theo một chuỗi và hệ thống sẽ thực thi chúng. Viết shell script cho phép bạn sử dụng các chức năng lập trình như các vòng lặp for, các câu lệnh if/then/else... Shell script có sẵn trên hầu hết các bản phân phối Linux, trên MacOS và Cygwin trên Windows. Shell script chỉ là các tập tin văn bản đơn giản. Bạn có thể sử dụng bất kỳ trình soạn thảo văn bản để viết như: vim, nano, gedit, emacs, vscode,... Tiện ích của shell script:
Các tập lệnh được lưu trữ dưới dạng các tập tin chúng ta có thể đặt tên tùy ý cho tập lệnh shell. Nhưng điều quan trọng đầu tiên là nó cần bắt đầu với một shebang ngay dòng đầu tiên: #!/bin/bashTiếp theo thì nó phải là một tập tin thực thi. Để có thể phân quyền cho tập tin là thực thi thì chúng ta sử dụng lệnh chmod: chmod u+x myscriptLệnh trên giúp cho tập tin myscript của chúng ta có thể thực thi được cho người dùng của bạn. Bạn có thể thực thi tập lệnh nếu bạn đang ở trong cùng một thư mục bằng cách gọi nó ./myscript hoặc sử dụng đường dẫn đầy đủ đến nó. Ngoài cách thực thi trên chúng ta có thể sử dụng lệnh bash để thực thi cú pháp như sau: bash duong-dan-file-scriptVí dụ 1: Sử dụng tính năng chú thích trong bash shell Chú thích là một trong những điều quan trọng nhất khi viết chương trình. Một dòng bắt đầu bằng ký tự # là một chú thích (ngoại trừ dòng shebang ở trên). #!/bin/bash # this is a commentMột bình luận cũng có thể bắt đầu ở cuối dòng: #!/bin/bash echo myscript # this is a commentVí dụ 2: Biến và toán tử trong bash shell Chúng ta có thể đặt biến bằng cách sử dụng toán tử = cú pháp như sau: name=valueVí dụ: NUMBER=1999 name=blogd.netSau khi đặt biến chúng ta có thể in một biến bằng cách sử dụng lệnh echo và thêm một ký tự $ tiếp theo là tên biến: echo $NUMBER echo $nameBash shell sử dụng một số toán tử số học thường được dùng trên các ngôn ngữ lập trình: Toán tửÝ nghĩa+Cộng vào-Trừ ra*Nhân/Chia%Phép chia lấy phần dư**Tính luỹ thừa=Gáng giá trị Chúng ta có thể so sánh các giá trị bằng cách sau: Phép so sánhÝ nghĩa< hoặc -ltBé hơn<= hoặc -leBé hơn bằng> hoặc -gtLớn hơn>= hoặc -geLớn hơn bằng== hoặc -eqBằng nhau-neKhông bằng Ví dụ sử dụng so sánh giá trị trong bash shell: #!/bin/bash age=23 min_age=18 if test $age -lt $min_age then echo "Not old enough" fiToán tử logic: Ví dụ 3: Các biến đặc biệt trong Linux. Các biến này được dành riêng cho các chức năng cụ thể. Ký tự $ đại diện cho số ID tiến trình, hoặc PID. Bảng sau đây thống kê một số biến đặc biệt mà bạn có thể sử dụng trong lập trình bash shell: BiếnÝ nghĩa$0Tên tập tin của tập lệnh hiện tại.$nCác biến này tương ứng với các đối số mà tập lệnh được gọi. Ở đây n là số nguyên dương tương ứng với vị trí của một đối số (đối số thứ nhất là $1, đối số thứ hai là $2,...).$#Số lượng đối số được cung cấp cho một tập lệnh.$*Tất cả các đối số được trích dẫn gấp đôi.$@Tất cả các đối số được trích dẫn riêng lẻ.$?Trạng thái thoát của lệnh cuối cùng được thực thi.$!Số tiến trình của lệnh nền cuối cùng. Ví dụ 1: Sử dụng các biến đặc biệt như $0, $n, $#, $@, $*: [root@localhost ~]# vi test.sh #!/bin/sh echo "Ten file hien tai: $0" echo "Doi so 1: $1" echo "Doi so 2: $2" echo "Doi so 3: $3" echo "Tong cac doi so: $#" echo "Tat ca doi so duoc trich dan: $@" echo "Tat ca doi so duoc trich dan: $*"Chạy tập tin bash chúng ta được kết quả như sau: [root@localhost ~]# ./test.sh https:// blogd .net Ten file hien tai: ./test.sh Doi so 1: https:// Doi so 2: blogd Doi so 3: .net Tong cac doi so: 3 Tat ca doi so duoc trich dan: https:// blogd .net Tat ca doi so duoc trich dan: https:// blogd .netVí dụ 2: Kết hợp tham số đặc biệt #@ và #* với dòng lặp for như sau: [root@localhost ~]# vi test_2.sh #!/bin/sh #Su dung bien dac biet $* for a in $* do echo $a done #Su dung bien dac biet $@ for a in $@ do echo $a doneChạy tập lệnh shell chúng ta được kết quả như bên dưới: [root@localhost ~]# ./test_2.sh Day la website blogd.net Day la website blogd.net Day la website blogd.netVí dụ 3: Trạng thái thoát của lệnh cuối cùng được thực thi: [root@localhost ~]# cat exit.sh #!/bin/sh echo "Trang thai thoat cua lenh cuoi cung duoc thuc thi: $?"Chạy tệp với lệnh bash: [root@localhost ~]# bash exit.sh Trang thai thoat cua lenh cuoi cung duoc thuc thi: 0Theo mặc định thì hầu hết các lệnh được thực hiện thành công thì trả về một trạng thái thoát là 0 và 1 nếu chúng không thành công. 3.1. Sử dụng bash shell in ra màn hìnhChạy lệnh sau từ thiết bị đầu cuối để thực hiện một câu lệnh bash rất đơn giản. Đầu ra của lệnh sẽ là blogd.net. [root@localhost ~]# echo "blogd.net" blogd.netNhưng khi chúng ta cần thực hiện in ra màn hình nhiều đầu ra và thực hiện thường xuyên thì việc gõ lệnh trên bash rất tốn thời gian vì vậy chúng ta sẽ tạo một bash shell in ra màn hình, khi cần chúng ta chỉ cần chạy file bash shell đó. Các bước như sau: Đầu tiên chúng ta sử dụng trình soạn thảo để tạo một tập tin bash. Ở đây chúng ta dùng trình soạn thảo văn bản vi được để tạo tập tin và tên tập tin được đặt là test.sh: [root@localhost ~]# vi test.shThêm tập lệnh sau vào tập tin test.sh và lưu tập tin: #!/bin/bash echo "test" echo test echo blogd.netĐể có thể chạy tập tin bash chúng ta có thể chạy bằng 2 cách sau:
Ví dụ 1: Sử dụng chú thích trong bash shell biểu tượng # được sử dụng để thêm chú thích dòng đơn trong tập lệnh bash. Tạo một tập tin mới có tên comment.sh và thêm tập lệnh sau với nhận xét dòng đơn. [root@localhost ~]# vi comment.sh #!/bin/bash # Tinh tong gia tri cua hai so 55 va 75 ((Tong=55+75)) #In ket qua echo Tong la: $TongChạy tập tin với lệnh bash. [root@localhost ~]# bash comment.sh Tong la: 130Ví dụ 2: Chúng ta có thể sử dụng chú thích nhiều dòng trong bash theo nhiều cách khác nhau. Tạo một bash mới có tên comments.sh và thêm tập lệnh sau. Ở đây biểu tượng : và ' được sử dụng để thêm chú thích nhiều dòng trong bash shell. [root@localhost ~]# vi comments.sh #!/bin/bash : ' Vi du sau se tinh gia tri binh phuong cua so 5. ' ((area=5*5)) echo Ket qua: $areaChạy tập tin với lệnh bash. [root@localhost ~]# bash comments.sh Ket qua: 25Ví dụ 3: Bash sử dụng lệnh mkdir để tạo một thư mục mới. [root@localhost ~]# vi folder.sh #!/bin/bash echo "Nhap ten thu muc can tao" read ten `mkdir $ten` [root@localhost ~]# ls -l -rw-r--r--. 1 root root 66 Jun 13 10:37 folder.shChạy tệp bằng lệnh bash. [root@localhost ~]# bash folder.sh Nhap ten thu muc can tao test [root@localhost ~]# ls -l total 4 -rw-r--r--. 1 root root 66 Jun 13 10:37 folder.sh drwxr-xr-x. 2 root root 6 Jun 13 10:37 test3.2. Sử dụng cấu trúc điều kiện trong bash shellChúng ta có thể sử dụng cấu trúc điều kiện với một hoặc nhiều điều kiện. Trong đó cấu trúc điều kiện bắt đầu bằng if và kết thúc bằng fi. Một số cú pháp thường dùng của cấu trúc điều kiện:
Ví dụ 1: Tạo file có tên if.sh. Chúng ta gán biến n bằng 20 và thực hiện điều kiện so sánh nếu $n bé hơn 10 in kết quả ra màn hình số có một chữ số và ngược lại in ra màn hình số có hai chữ số: [root@localhost ~]# vi if.sh #!/bin/bash n=20 if [ $n < 10 ]; then echo "So co mot chu so" else echo "So co hai chu so" fiChạy tệp với lệnh bash. [root@localhost ~]# bash if.sh So co hai chu soVí dụ 2: Sử dụng câu lệnh if với logic AND: Chúng ta có thể xác định nhiều điều kiện trong câu lệnh if bằng logic AND (&&). Tạo một tệp có tên if_and.sh giá trị của các biến tên người dùng và mật khẩu sẽ được nhập vào và so sánh với username va password trong if. Nếu cả hai giá trị khớp nhau thì đầu ra sẽ là người dùng hợp lệ , nếu không, đầu ra sẽ là người dùng không hợp lệ . [root@localhost ~]# vi if_and.sh #!/bin/bash echo "Nhap ten nguoi dung:" read username echo "Nhap mat khau" read password if [[ ( $username == "admin" && $password == "admin" ) ]]; then echo "Nguoi dung hop le" else echo "Nguoi dung khong hop le" fiChạy tệp với lệnh bash. [root@localhost ~]# bash if_and.sh Nhap ten nguoi dung: admin Nhap mat khau admin Nguoi dung hop leVí dụ 3: Sử dụng câu lệnh if với logic OR Tạo một file có tên if_or.sh và giá trị của n sẽ được nhập từ người dùng. Nếu giá trị bằng 150 hoặc 400 thì đầu ra sẽ là bạn đã nhập đúng, ngược lại thì trả về kết quả bạn nhập sai. [root@localhost ~]# vi if_or.sh #!/bin/bash echo "Nhap gia tri vao:" read n if [[ ( $n == 150 || $n == 400 ) ]] then echo "Ban da nhap dung" else echo "Ban da nhap sai" fiChạy tệp với lệnh bash. [root@localhost ~]# bash if_or.sh Nhap gia tri vao: 150 Ban da nhap dung [root@localhost ~]# bash if_or.sh Nhap gia tri vao: 200 Ban da nhap saiVí dụ 4: Nếu bạn muốn kiểm tra sự tồn tại của thư mục trong vị trí hiện tại trước khi thực hiện lệnh mkdir thì có thể sử dụng tùy chọn -d để kiểm tra một thư mục cụ thể có tồn tại hay không như sau: [root@localhost ~]# vi folder2.sh #!/bin/bash echo "Nhap ten thu muc can tao: " read name if [ -d "$name" ] then echo "Ten thu muc da ton tai" else `mkdir $name` echo "Tao thu muc thanh cong" fiChạy tệp bằng lệnh bash. [root@localhost ~]# ls -l total 8 -rw-r--r--. 1 root root 161 Jun 13 10:42 folder2.sh drwxr-xr-x. 2 root root 6 Jun 13 10:37 test [root@localhost ~]# bash folder2.sh Nhap ten thu muc can tao: test Ten thu muc da ton tai [root@localhost ~]# bash folder2.sh Nhap ten thu muc can tao: test1 Tao thu muc thanh cong [root@localhost ~]# ls -l total 8 -rw-r--r--. 1 root root 161 Jun 13 10:42 folder2.sh drwxr-xr-x. 2 root root 6 Jun 13 10:37 test drwxr-xr-x. 2 root root 6 Jun 13 10:43 test13.2. Sử dụng cấu trúc vòng lặp trong bash shellMột số cú pháp cấu trúc vòng lặp thường được sử dụng:
Trong các vòng lặp, chúng ta có thể sử dụng các câu lệnh break hay continue để phá vỡ vòng lặp hoặc chỉ cần bỏ qua bước lặp hiện tại. Ví dụ 1: Sử dụng vòng lặp for Tạo một tệp có tên for.sh và thêm tập lệnh sau bằng vòng lặp for. Ở đây, vòng lặp for sẽ lặp lại trong 5 lần và in tất cả các giá trị của biến, bộ đếm trong một dòng. [root@localhost ~]# vi for.sh #!/bin/bash for ((n=5; n>0; n--)) do echo -n "$n " done printf "\n"Chạy tệp với lệnh bash. [root@localhost ~]# bash for.sh 5 4 3 2 1Ví dụ 2: Sử dụng vòng lặp while Tạo một tệp có tên while.sh và thêm tập lệnh sau bằng vòng lặp while. Ở đây, vòng lặp while sẽ in tất cả các số từ 1 đến 5. [root@localhost ~]# vi while.sh #!/bin/sh a=1 while [ $a -le 5 ] do echo $a a=`expr $a + 1` doneChạy tệp với lệnh bash. [root@localhost ~]# bash while.sh 1 2 3 4 5Ví dụ 3: Sử dụng vòng lặp until Tạo một tệp có tên until.sh và thêm tập lệnh sau bằng vòng lặp until. Ở đây, vòng lặp until sẽ in tất cả các số từ 10 đến 15. [root@localhost ~]# vi until.sh #!/bin/sh a=10 until [ ! $a -le 15 ] do echo $a a=`expr $a + 1` done [root@localhost ~]# bash until.sh 10 11 12 13 14 153.3. Cấu trúc case trong bash shellCấu trúc của case nó được bắt đầu bằng case và kết thúc bằng esac cho phép chúng ta chọn các tuyến khác nhau tùy thuộc vào một giá trị có cú pháp như sau: case value in a) command #... ;; b) command #... ;; esacChúng ta cần thêm một dấu chấm phẩy kép (;;) sau mỗi trường hợp. Ví dụ: Tạo một tệp mới có tên case.sh và thêm tập lệnh sau. Đầu ra của tập lệnh sau sẽ giống với tập lệnh trong ví dụ: [root@localhost ~]# vi case.sh #!/bin/bash echo "Nhap gia tri n:" read n case $n in 10|15) echo "Ban doan dung so n thu nhat" ;; 119) echo "Ban doan dung so n thu hai" ;; 389) echo "Ban doan dung so n thu ba" ;; *) echo "Thu lai lan tiep theo" ;; esacChạy tệp với lệnh bash. [root@localhost ~]# bash case.sh Nhap gia tri n: 10 Ban doan dung so n thu nhat [root@localhost ~]# bash case.sh Nhap gia tri n: 399 Thu lai lan tiep theo3.4. Cú pháp lựa chọn trong bash shellCấu trúc select sẽ hiển thị cho người dùng một menu các lựa chọn để người dùng có thể lựa chọn: select item in list do command doneVí dụ: Tạo tập tin select.sh và tạo các tùy chọn như sau: [root@localhost ~]# vi e.sh #!/bin/bash select n in "di bien" "an uong" "di nui" "xem phim" "the thao" do if [ "$n" == "" ]; then echo "Ban hay chon mot"; else break fi done echo "So thich cua ban $n" [root@localhost ~]# bash e.sh 1) di bien 2) an uong 3) di nui 4) xem phim 5) the thao #? 5 So thich cua ban the thao3.5. Làm việc với các chuỗiCho một chuỗi: strings="Blogd.net"Chúng ta có thể lấy chiều dài của chuỗi bằng cách sử dụng ${#strings}. Luôn sử dụng dấu ngoặc kép quanh các chuỗi, khi chúng ta làm việc với nó để tránh bash diễn giải các ký tự đặc biệt bên trong chúng. Ngoài ra bạn có thể so sánh 2 chuỗi bằng cách sử dụng toán tử = hoặc ==: "$strings" = "$anotherstrings" "$strings" == "$anotherstrings" Bạn cũng có thể kiểm tra sự khác nhau giữa hai chuỗi: "$strings" != "$anotherstrings" Ví dụ: Kết hợp các biến chuỗi trong bash. Tạo một tập tin có tên string.sh và thêm đoạn mã sau để có thể kết hợp các biến chuỗi trong bash sử dụng toán tử + hoặc in các biến với nhau như sau: [root@localhost ~]# vi string.sh #!/bin/bash string1="Centos" string2="7" echo "$string1$string2" string3=$string1+$string2 string3+=" blogd.net" echo $string3Chạy tệp với lệnh bash. [root@localhost ~]# bash string.sh Centos7 Centos+7 blogd.net3.6. Sử dụng mảngMảng là một danh sách các mục, được khai báo bên trong dấu ngoặc đơn như sau: a=("di bien" "an uong" "di nui" "xem phim" "the thao")Bạn có thể tham chiếu bất kỳ mục nào trong một mảng bằng dấu ngoặc vuông: a[0] a[1]Bạn có thể nhận được tổng số mục trong một mảng bằng cú pháp này: ${#a[@]}3.7. Sử dụng functionCũng giống như javascript hay ngôn ngữ lập trình nào khác, chúng ta có thể tạo ra các đoạn mã nhỏ để có thể sử dụng lại khi cần thiết, bằng cách đặt tên cho chúng và gọi chúng khi cần. Cú pháp của một hàm như sau: function name { }Trong đó name là tên chúng ta cần đặt cho hàm, và là tên để chúng ta gọi khi cần thiết. Ví dụ 1: Tạo một hàm đơn giản và gọi hàm được hiển thị trong đoạn script sau. Tạo một tập tin có tên function.sh và thêm đoạn mã sau. Bạn có thể gọi bất kỳ chức năng nào bằng tên mà không sử dụng bất kỳ dấu ngoặc nào trong tập lệnh bash. [root@localhost ~]# vi function.sh #!/bin/bash function test1(){ echo "Toi rat thich blogd.net" } test1Chạy tệp với lệnh bash. [root@localhost ~]# bash function.sh Toi rat thich blogd.netVí dụ 2: Bash không thể khai báo tham số tại thời điểm khai báo hàm. Nhưng chúng ta có thể sử dụng các tham số trong hàm bằng cách sử dụng biến khác. Tạo một tập tin có tên function.sh và thêm đoạn mã sau tính diện tích hình chữ nhật: [root@localhost ~]# vi function_parameter.sh #!/bin/bash Tinh_s() { area=$(($1*$2)) echo "Dien tich la : $area" } Tinh_s 30 20Chạy tệp bằng lệnh bash. [root@localhost ~]# bash function_parameter.sh Dien tich la : 600Qua bài trên, giúp cho chúng ta biết cách sử dụng lập trình bash shell trên hệ điều hành Linux. Qua các ví dụ cơ bản bên trên giúp chúng ta có viết các script phục vụ công việc hằng ngày của chúng ta một cách tiện lợi nhất. |