Linux

Làm quen với Shell Script

Tập lệnh Shell là một phần quan trọng của quá trình tự động hóa trong Linux. Scripting giúp bạn viết một chuỗi các lệnh trong một tệp và sau đó thực thi chúng.

Nhờ vào scripting, bạn sẽ tiết kiệm được kha khá thời gian do không cần viết đi viết lại những câu lệnh nhất định. Thay vào đó, bạn sẽ thực hiện nó một các tự động hàng ngày, thậm chí còn có thể lên lịch cho nó thực thi.

Bạn cũng có thể đặt một số tập lệnh nhất định để thực thi khi khởi động, chẳng hạn như hiển thị một thông báo cụ thể về việc khởi chạy một phiên mới hoặc đặt một số biến môi trường nhất định.

Nói về script thì các ứng dụng cũng như cách sử dụng nó có rất nhiều, do đó chúng ta hãy cùng theo dõi bài viết sau đây đề tìm hiểu sâu hơn về nó.

Xem thêm: Bash Script là gì? Vì sao Bash Script lại quan trọng trong lĩnh vực lập trình?

Giới thiệu về Bash Shell

Có thể bạn chưa biết, nhưng các dòng lệnh Linux hoạt được dựa vào chương trình cung cấp Shell. Shell đã phát triển để phục vụ cho nhiều tùy chọn khác nhau trong những năm qua.

Một số người dùng khác nhau có nhu cầu cấu hình để được sử dụng các trình shell khác nhau. Nhưng hầu hết người dùng thích gắn bó với trình shell mặc định hiện tại. Shell mặc định cho nhiều bản phân phối Linux là GNU Bourne-Again Shell (bash). Bash được thành công bởi Bourne shell (sh).

Khi bạn khởi chạy trình shell lần đầu tiên, nó sử dụng tập lệnh khởi động nằm trong tệp .bashrc hoặc .bash_profile cho phép bạn tùy chỉnh hành vi của trình shell.

Khi một shell được sử dụng để tương tác, nó sẽ hiển thị $ khi nó đang đợi lệnh từ người dùng. Đây được gọi là dấu nhắc trình shell.

Xem thêm: Lập trình Shell (Bash script)

Shell types

Có 2 loại shell chính:

  • Bourne shell (mặc định có dấu nhắc lệnh là $ như ở trên)
  • C shell (dấu nhắc lệnh là %)

Trong Bourne shell còn có các loại khác nhau như:

  • Bourne shell (sh)
  • Korn shell (ksh)
  • Bourne Again shell (bash)
  • POSIX shell (sh)

C shell thì có:

  • C shell (csh)
  • TENEX/TOPS C shell (tcsh)

Bash Script là gì?

Bash Scrip là một chuỗi các lệnh được viết trong một tệp. Chúng được đọc và thực thi bởi chương trình bash. Chương trình này sẽ thực hiện từng dòng lệnh.

Ví dụ: bạn có thể điều hướng đến một đường dẫn nhất định, tạo một thư mục và tạo ra một quy trình bên trong nó bằng dòng lệnh. Bạn có thể thực hiện các bước tương tự theo trình tự bằng cách lưu các tệp trong một tập lệnh bash và thực thi nó. Tập lệnh được chạy với số lần không giới hạn.

Xem thêm: Shell là gì ? Sự khác nhau giữa SH và Bash

Làm thế nào để bạn xác định một tập lệnh Bash?

1. Phần mở rộng tệp .sh

Theo quy ước đặt tên, các tập lệnh bash thường có đuôi .sh. Tuy nhiên, các tập lệnh bash có thể chạy hoàn toàn tốt mà không có phần mở rộng sh.

2. Tập lệnh bắt đầu bằng một bang

Tập lệnh còn được xác định với một shebang. Shebang là sự kết hợp giữa bash #bang! theo đường dẫn bash shell. Đây là dòng đầu tiên của script. Shebang ra lệnh cho shell thực thi nó thông qua bash shell. Shebang chỉ đơn giản là một đường dẫn tuyệt đối đến trình thông dịch bash.

3. Quyền thực thi

Các tập lệnh sẽ cấp quyền thực thi cho người dùng thực thi chúng.

Quyền thực thi được đại diện bằng chữ x. Trong ví dụ bên dưới, người dùng sẽ có quyền rwx (đọc, ghi, thực thi) đối với tệp test_script.sh

4. Màu tệp

Các tập lệnh thực thi xuất hiện với màu khác so với phần còn lại của các tệp và thư mục.

Trong trường hợp này, các tập lệnh có quyền thực thi xuất hiện dưới dạng màu xanh lục.

Biến trong shell

Đặt tên

Như mọi ngôn ngữ khác, tên biến chỉ bao gồm các chữ cái a đến z, từ A đến Z, chữ số từ 0 tới 9 và dấu _, tên biến không được bắt đầu bằng chữ số.

Khai báo

variable_name=variable_value

Ví dụ:

A="Nguyễn Văn A"

Sử dụng

A="Nguyễn Văn A"
echo $A

Biến Read-only

Sau khi khai báo biến này, thì giá trị của biến không thể bị thay đổi.

A@bla-bla ~ $ A="Nguyễn Văn A"
A@bla-bla ~ $ readonly A
A@bla-bla ~ $ A="Muốn Thay Tên Khác"
bash: A: readonly variable

Xóa giá trị của biến

A@bla-bla ~ $ b="value"
A@bla-bla ~ $ echo $b
value
A@bla-bla ~ $ unset b
A@bla-bla ~ $ echo $b

A@bla-bla ~ $

Các loại biến

  • Biến hệ thống: tạo ra và quản lý bởi system, tên là chữ hoa, ví dụ
A@bla-bla ~ $ echo $SHELL
/bin/bash
A@bla-bla ~ $ echo $TERM
xterm
  • Biến do người dùng định nghĩa: tạo ra và quản lý bởi người dùng, tên lung tung, thỏa mãn yêu cầu đặt tên của shell.

Mảng

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"

Nếu dùng ksh shell thì có thể khai báo:

set -A array_name value1 value2 ... valuen

Nếu dùng bash shell thì khai báo thế này:

array_name=(value1 ... valuen)

Để sử dụng 1 giá trị trong mảng:

${array_name[index]}

hoặc tất cả giá trị trong mảng:

${array_name[*]}
${array_name[@]}

Ví dụ:

#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"

Kết quả:

$./test.sh
First Index: Zara
Second Index: Qadir
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

Các phép toán số học

Để thực hiện các phép toán số học, cần dùng expr để thực hiện:

#!/bin/sh

val=`expr 2 + 2`
echo "Total value : $val"

Kết quả:

Total value : 4

Với $a có giá trị 10 và $b có giá trị 20, ta có bảng sau:

Phép tínhÝ nghĩaVí dụ
+Phép cộngexpr $a + $b trả kết quả 30
Phép trừexpr $a - $b trả kết quả -10
*Phép nhânexpr $a \* $b trả kết quả 200
/Phép chiaexpr $b / $a trả kết quả 2
%Phép chia lấy dưexpr $b % $a trả kết quả 0
=Gán giá trịa=$b giá trị của b sẽ gán cho $a, giờ $a có giá trị là 20
==So sánh bằng, trả về true nếu 2 biến cùng giá trị[ $a == $b ] trả về false
!=So sánh không bằng, trả về true nếu 2 biến khác giá trị[ $a == $b ] trả về true

Phép toán quan hệ

Vẫn với $a có giá trị 10 và $b có giá trị 20, ta có bảng sau:

Phép tínhÝ nghĩaVí dụ
-eqKiểm tra giá trị 2 toán tử có bằng nhau hay không, bằng thì trả về true[ $a -eq $b ] trả kết quả không phải là true
-neKiểm tra giá trị 2 toán tử có bằng nhau hay không, không thì trả về true[ $a -ne $b ] trả kết quả true
-gtKiểm tra giá trị của toán tử bên trái có lớn hơn giá trị bên phải hay không, có trả về true[ $a -gt $b ] trả kết quả không phải là true
-ltKiểm tra giá trị của toán tử bên trái có nhỏ hơn giá trị bên phải hay không, có trả về true[ $a -lt $b ] trả kết quả true
-geKiểm tra giá trị của toán tử bên trái có lớn hơn hoặc bằng giá trị bên phải hay không, có trả về true[ $a -ge $b ] trả kết quả không phải là true
-leKiểm tra giá trị của toán tử bên trái có nhỏ hơn hoặc bằng giá trị bên phải hay không, có trả về true[ $a -le $b ] trả kết quả là true

Cấu trúc rẽ nhánh

Ví dụ:

#!/bin/sh

a=10
b=20

if [ $a == $b ]
then
   echo "a is equal to b"
fi

if [ $a == $b ]
then
   echo "a is equal to b"
elif [ $a -gt $b ]
then
   echo "a is greater than b"
elif [ $a -lt $b ]
then
   echo "a is less than b"
else
   echo "None of the condition met"
fi

Cấu trúc lặp

Vòng lặp while

#!/bin/sh

a=0

while [ $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Vòng lặp for

#!/bin/sh

for var in 0 1 2 3 4 5 6 7 8 9
do
   echo $var
done

Vòng lặp until

#!/bin/sh

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Vòng lặp select

#!/bin/ksh

select DRINK in tea cofee water juice appe all none
do
   case $DRINK in
      tea|cofee|water|all)
         echo "Go to canteen"
         ;;
      juice|appe)
         echo "Available at home"
      ;;
      none)
         break
      ;;
      *) echo "ERROR: Invalid selection"
      ;;
   esac
done

Kết quả của vòng select

$./test.sh
1) tea
2) cofee
3) water
4) juice
5) appe
6) all
7) none
#? juice
Available at home
#? none

Hàm

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World"
}

# Invoke your function
Hello

Chạy script

$./test.sh
Hello World

Dùng hàm với parameters:

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2 $3"
}

# Invoke your function
Hello Nguyễn Văn A

Kết quả:

$./test.sh
Hello World Nguyễn Văn A

Lấy kết quả trả về từ hàm

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2 $3"
   return 10
}

# Invoke your function
Hello Nguyễn Văn A

# Capture value returnd by last command
ret=$?

echo "Return value is $ret"

Kết quả:

$./test.sh
Hello World Nguyễn Văn A
Return value is 10

Tổng kết

Bài viết trên đây đã giúp các bạn có thêm kiến thức về shell script đồng thời biết cách viết Bash Script một cách cơ bản thông qua các ví dụ thiết thực. Hy vọng các bạn có thể vận dụng nó để viết nên các trương chình có ý nghĩa trong quá trình làm việc của bạn.

Nếu bạn còn gì thắc mắc về shell script, hãy để lại bình luận ở bên dưới, NetworkBoo sẽ trả lời bạn trong thời gian sớm nhất. Hãy đón xem bài viết tiếp theo của tôi về Các ví dụ học Bash Script. Xin cảm ơn!

Một số bài viết liên quan có thể bạn quan tâm:

Mọi thắc mắc xin hãy liên hệ
Email: [email protected]

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button