Lập trình, Linux

Hướng dẫn làm thế nào để viết Bash Scripting trong Linux

Bash shell là một trong những thành phần mạnh mẽ nhất của hệ điều hành Linux, đồng thời cũng là một trong những lý do hấp dẫn nhất để sử dụng Linux. Người dùng có thể tương tác với Bash thông qua dòng lệnh và viết các script để tự động hóa các tác vụ. Mặc dù điều này nghe có vẻ đáng sợ với người mới bắt đầu, nhưng thật ra bắt đầu với Bash scripting không quá khó các bạn nhé.


Contents

Bash Script là gì?

Bash script là một file văn bản chứa một chuỗi các lệnh được viết cho Bash shell, dùng để tự động hóa các tác vụ, thực thi nhiều lệnh, hoặc tạo ra các chương trình đơn giản trên các hệ thống dựa trên Unix như Linux và macOS. Điều đó có nghĩa là nếu bạn thường xuyên sử dụng dòng lệnh Linux, thì Bash script sẽ khá đơn giản với bạn. Mọi thứ trong một Bash script đều có thể thực thi trực tiếp từ dòng lệnh.

Trong hướng dẫn này, tôi sẽ hướng dẫn bạn qua nhiều ví dụ về Bash script để bạn thấy được sức mạnh và cách khai thác các khía cạnh khác nhau của Bash.


Những gì bạn sẽ học trong hướng dẫn này:

  • Cách viết script “Hello World” đầu tiên bằng Bash

  • Cách truyền tham số vào Bash script

  • Cách sử dụng biến toàn cục và cục bộ trong Bash

  • Cách đọc dữ liệu đầu vào từ người dùng

  • Cách nạp và đọc mảng trong Bash

  • Cách so sánh số nguyên và chuỗi

  • Cách kiểm tra loại file trong Bash

  • Cách sử dụng vòng lặp for, whileuntil

  • Cách định nghĩa và sử dụng hàm trong Bash

  • Cách sử dụng câu lệnh if

  • Cách sử dụng câu lệnh case

  • Cách sử dụng dấu ngoặc kép và ký tự đặc biệt trong Bash

  • Cách thực hiện phép tính số học trong Bash

  • Cách sử dụng chuyển hướng đầu ra trong Bash

Yêu cầu phần mềm và quy ước dòng lệnh Linux

Danh mục Yêu cầu, Quy ước hoặc Phiên bản phần mềm được sử dụng
Hệ thống Hệ điều hành Linux
Phần mềm Bash shell (được cài sẵn theo mặc định)
Khác Quyền truy cập với đặc quyền root hoặc sử dụng lệnh sudo
  • # – yêu cầu thực hiện lệnh với quyền root (trực tiếp dưới quyền root hoặc dùng sudo)

  • $ – thực hiện lệnh như người dùng bình thường (không có đặc quyền)


Hello World Bash Script – Hướng dẫn Bash Scripting

Bước 1: Xác định vị trí trình thông dịch Bash

Trước hết, bạn cần kiểm tra trình thông dịch Bash nằm ở đâu. Nhập lệnh sau trong dòng lệnh:

$ which bash
/bin/bash

Kết quả cho thấy Bash shell nằm ở đường dẫn /bin/bash. Thông tin này sẽ dùng ngay sau đây.

phuonglh@ubuntusvr01:~$ which bash /bin/bash
/usr/bin/bash
/bin/bash


Bước 2: Tạo file script

Tiếp theo, mở trình soạn thảo văn bản mà bạn yêu thích và tạo một file có tên là hello_world.sh. Ví dụ, chúng ta dùng nano:

$ nano hello_world.sh

Bước 3: Nhập nội dung sau và lưu lại:

#!/bin/bash
# Khai báo biếnSTRING
STRING="Hello World"
# In biến ra màn hình
echo $STRING

Shebang là gì?

Mỗi Bash script trong hướng dẫn này đều bắt đầu bằng một dòng gọi là shebang:

#!/bin/bash

Dòng này không phải là chú thích, mà là nơi chỉ định chương trình sẽ dùng để thực thi script — trong trường hợp này là Bash.


Bước 4: Cấp quyền thực thi cho file script

Đi đến thư mục chứa file hello_world.sh và thực hiện:

$ chmod +x hello_world.sh

Bước 5: Thực thi Bash script

$ ./hello_world.sh

Kết quả bạn nhận được sẽ là:

Hello World

Script sao lưu đơn giản trong Bash

Khi viết một Bash script, về cơ bản bạn đang đưa vào đó những lệnh mà bạn có thể thực hiện trực tiếp trên dòng lệnh. Một ví dụ hoàn hảo cho việc này là đoạn script sau:

#!/bin/bash
tar -czf myhome_directory.tar.gz /home/phuonglh

Đoạn script này sẽ tạo một file nén .tar.gz chứa toàn bộ thư mục home của người dùngphuonglh.

Lệnh tar mà chúng ta dùng trong script này thực chất hoàn toàn có thể được thực thi trực tiếp từ dòng lệnh. Vậy ưu điểm của việc viết thành script là gì? — Nó cho phép chúng ta thực thi nhanh chóng mà không cần nhớ cú pháp chi tiết hoặc phải gõ lại mỗi lần. Chúng ta cũng có thể mở rộng script sau này cho các tác vụ phức tạp hơn.


Biến trong Bash scripts

Trong ví dụ này, chúng ta khai báo một biến đơn giản $STRING và in nó ra màn hình (stdout) bằng lệnh echo:

#!/bin/bash
STRING="HELLO WORLD!!!"
echo $STRING

Kết quả khi thực thi script:

$ ./hello_world.sh
HELLO WORLD!!!

Nâng cấp với ví dụ backup dữ liệu với biến và dấu thời gian

Giờ ta quay lại ví dụ sao lưu trước đó, nhưng lần này sẽ sử dụng biến để đặt tên tệp sao lưu kèm theo dấu thời gian (timestamp) bằng cách sử dụng lệnh date:

#!/bin/bash
OF=mybackup_directory_$(date +%Y%m%d).tar.gz
sudo tar -czf $OF /usr/local

Kết quả khi thực thi:

$ ./backup.sh
$ ls
myhome_directory_20250516.tar.gz

Nhìn vào tên file, ta có thể dễ dàng biết ngày thực hiện backup — ví dụ như ngày 16/05/2025.

Biến toàn cục và biến cục bộ trong Bash

Trong Bash scripting:

  • Biến toàn cục (global variable): Có thể được sử dụng ở bất cứ đâu trong toàn bộ script.

  • Biến cục bộ (local variable): Chỉ có hiệu lực trong hàm (function) nơi nó được khai báo.

Ví dụ:

#!/bin/bash
 
# Khai báo biến toàn cục
# Biến này có thể được dùng ở bất cứ đâu trong script
VAR="globalvar"
 
function print_local {
   # Khai báo biến cục bộ
   # Biến này chỉ tồn tại trong hàm 'bash'
   local VAR="localvar"
   echo $VAR
}
 
# In biến trước khi gọi hàm
 
echo $VAR
 
# Gọi hàm
 
print_local
 
# In lại biến toàn cục để thấy không bị thay đổi
 
echo $VAR

Kết quả khi thực thi script:

$ ./variables.sh
globalvar
localvar
globalvar

Lưu ý: locallà từ khóa dành riêng trong Bash để khai báo biến cục bộ. Như bạn thấy, giá trị biến toàn cục không bị thay đổi bởi giá trị bên trong hàm.

Truyền đối số vào Bash Script

Khi chạy một Bash script, bạn có thể truyền đối số (tham số) từ dòng lệnh. Dưới đây là một ví dụ cho thấy cách script có thể xử lý các đối số đó:

#!/bin/bash

# Sử dụng các biến định sẵn để truy cập đối số
# In các đối số ra màn hình
echo $1 $2 $3 ' -> echo $1 $2 $3'

# Cũng có thể lưu đối số vào một mảng đặc biệt
args=("$@")
echo ${args[0]} ${args[1]} ${args[2]} ' -> args=("$@"); echo ${args[0]} ${args[1]} ${args[2]}'

# In tất cả các đối số một lúc
echo $@ ' -> echo $@'

# In ra số lượng đối số
echo "Số lượng đối số truyền vào: $# -> echo $#"

Ví dụ khi chạy script với 3 đối số:

$ ./arguments.sh Bash Scripting Tutorial

Kết quả:

Bash Scripting Tutorial -> echo $1 $2 $3
Bash Scripting Tutorial -> args=("$@");
echo ${args[0]} ${args[1]} ${args[2]}
Bash Scripting Tutorial -> echo $@
Số lượng đối số truyền vào: 3 -> echo $#
Ghi nhớ:
  • $1, $2, $3… là các biến đại diện cho đối số thứ nhất, thứ hai, thứ ba,…

  • $@ là tất cả đối số dưới dạng mảng

  • $# là số lượng đối số được truyền vào script

Thực thi lệnh Shell trong Bash

Cách tốt nhất để thực thi một lệnh shell bên trong Bash script là sử dụng subshell với cú pháp $().

Ví dụ:

#!/bin/bash
# Thực thi lệnh trong subshell
echo $(uname -o)
# Không dùng subshell – chỉ in ra chuỗi
echo uname -o

Kết quả:

$ ./subshell.sh

GNU/Linux
uname -o

Dòng đầu sử dụng $(uname -o) sẽ chạy lệnh và in kết quả thực tế. Dòng thứ hai chỉ in nguyên văn dòng chữ uname -o.


Đọc dữ liệu người dùng

Bạn có thể dùng lệnh read để thu nhận đầu vào từ người dùng. Điều này giúp script tương tác linh hoạt hơn.

Ví dụ:

#!/bin/bash

echo -e "Hello, please type a word: \c"
read word
echo "The word you entered is: $word"

echo -e "Please type two words: "
read word1 word2
echo "You have entered: \"$word1\" \"$word2\""

echo -e "How do you feel about bash scripting?"
read
echo "You answer: $REPLY – sounds great!"

echo -e "What is your favorite color? (enter multiple colors separated by spaces)"
read -a colours
echo "I also like the colors: ${colours[0]}, ${colours[1]} and ${colours[2]} :-)"

Kết quả khi chạy:

$ ./read.sh 
Hello, please type a word: luuhophuong.com
The word you entered is: luuhophuong.com
Please type two words:
Ubuntu Redhat
You have entered: “Ubuntu” “Redhat”
How do you feel about bash scripting?
Good
You answer: Good – sounds great!
What is your favorite color? (enter multiple colors separated by spaces)
Green
I also like the colors: Green, and 🙂

Lệnh trap trong Bash

Lệnh trap được dùng trong Bash script để bắt các tín hiệu (signals) gửi đến script, và thực thi một hàm con (subroutine) khi các tín hiệu đó xảy ra.

Ví dụ bên dưới sẽ phát hiện khi người dùng nhấn Ctrl + C (gửi tín hiệu INT).

#!/bin/bash

# Lệnh trap để gọi hàm bashtrap khi có tín hiệu INT
trap bashtrap INT

# Lệnh xóa màn hình
clear

# Định nghĩa hàm bashtrap sẽ chạy khi Ctrl+C được nhấn
bashtrap() {
       echo "Phát hiện CTRL+C!... Đang chạy trap!"
}

# Vòng lặp từ 1 đến 10
for a in `seq 1 10`; do
       echo "$a/10 để thoát."
       sleep 1
done

echo "Thoát khỏi ví dụ Bash Trap!"

Kết quả khi thực thi:

$ ./trap.sh
1/10 để thoát.
2/10 để thoát.
^CPhát hiện CTRL+C!... Đang chạy trap!
3/10 để thoát.
4/10 để thoát.
^CPhát hiện CTRL+C!... Đang chạy trap!
5/10 để thoát.
...
10/10 để thoát.
Thoát khỏi ví dụ Bash Trap!

Lưu ý: Mặc dù Ctrl + C được nhấn hai lần, script vẫn không bị dừng vì trap đã xử lý tín hiệu đó.

Mảng trong Bash Script

Bash hỗ trợ lưu trữ giá trị trong mảng. Dưới đây là hai ví dụ:


1. Khai báo mảng đơn giản

Ví dụ này tạo một mảng gồm 4 phần tử:

#!/bin/bash

# Khai báo mảng với 4 phần tử
ARRAY=('Debian Linux' 'Redhat Linux' 'Ubuntu' 'Linux')

# Lấy số phần tử trong mảng
ELEMENTS=${#ARRAY[@]}

# In từng phần tử của mảng ra màn hình bằng vòng lặp for
for (( i=0; i<$ELEMENTS; i++ )); do
        echo ${ARRAY[$i]}
done

Kết quả khi thực thi:

$ ./arrays.sh
Debian Linux
Redhat Linux
Ubuntu
Linux

2. Đọc dữ liệu từ file vào mảng

Bạn cũng có thể nạp dữ liệu từ một file vào mảng Bash như sau:

#!/bin/bash

# Khai báo mảng
declare -a ARRAY

# Gán bộ đọc 10 với stdin
exec 10<&0

# Đọc dữ liệu từ file truyền vào dưới dạng đối số
exec < $1

let count=0

while read LINE; do
     ARRAY[$count]=$LINE
    ((count++))
done

echo "Số phần tử trong mảng: ${#ARRAY[@]}"
echo "Nội dung mảng: ${ARRAY[@]}"

# Khôi phục stdin ban đầu
exec 0<&10 10<&-

Giả sử chúng ta có một file làbash.txtchứa:

Bash

Scripting

Tutorial

Guide

Khi chạy script:

$ ./bash-script.sh bash.txt
Số phần tử trong mảng: 4
Bash Scripting Tutorial Guide

Câu lệnh điều kiện if/else/fi trong Bash

Dưới đây là ví dụ đơn giản kiểm tra xem một thư mục có tồn tại hay không. Tùy vào kết quả, script sẽ thực hiện một trong hai hành động.

Lưu ý: Cần có dấu cách cả trước và sau dấu ngoặc vuông [] – nếu không chạy sẽ bị lỗi!

#!/bin/bash

directory="./BashScripting"

# Kiểm tra nếu thư mục tồn tại
if [ -d $directory ]; then
   echo "Thư mục tồn tại"
else
   echo "Thư mục không tồn tại"
fi

Kết quả:

$ ./bash_if_else.sh
Thư mục không tồn tại
$ mkdir BashScripting
$ ./bash_if_else.sh
Thư mục tồn tại

Câu lệnh if/else lồng nhau (nested if/else)

Bạn có thể đặt một câu lệnh if bên trong một câu if khác — gọi là lồng nhau. Dưới đây là ví dụ kiểm tra lựa chọn của người dùng:

#!/bin/bash

# Khai báo biến lựa chọn với giá trị mặc định là 4
choice=4

# Hiển thị menu
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Vui lòng chọn một từ [1,2 hoặc 3]? "

# Vòng lặp while chạy cho đến khi chọn hợp lệ
while [ $choice -eq 4 ]; do
    read choice

    if  [ $choice -eq 1 ];  then
       echo "Bạn đã chọn: Bash"
    else
       if  [ $choice -eq 2 ];  then
           echo "Bạn đã chọn: Scripting"
       else
          if [ $choice -eq 3 ]; then
             echo "Bạn đã chọn: Tutorial"
          else
              echo "Vui lòng chọn từ 1 đến 3!"
              echo "1. Bash"
              echo "2. Scripting"
              echo "3. Tutorial"
              echo -n "Chọn lại nhé [1,2 hoặc 3]? "
              choice=4
            fi
        fi
   fi
done

$ ./nested_if_else.sh
1. Bash
2. Scripting
3. Tutorial
Vui lòng chọn một từ [1,2 hoặc 3]? 5
Vui lòng chọn từ 1 đến 3!

Chọn lại nhé [1,2 hoặc 3]? 2
Bạn đã chọn: Scripting

So sánh trong Bash

Bash có thể so sánh số nguyên (integers) hoặc chuỗi (strings) để xác định xem chúng bằng nhau, lớn hơn, hay nhỏ hơn.


So sánh số nguyên

Toán tử Ý nghĩa
-lt nhỏ hơn
-gt lớn hơn
-le nhỏ hơn hoặc bằng
-ge lớn hơn hoặc bằng
-eq bằng nhau
-ne không bằng

#!/bin/bash
NUM1=2
NUM2=2

if [ $NUM1 -eq $NUM2 ]; then
   echo "Hai giá trị bằng nhau"
else
   echo "Hai giá trị KHÔNG bằng nhau"
fi

Kết quả:

Hai giá trị bằng nhau

Ví dụ 2: Hai số khác nhau

#!/bin/bash

NUM1=2
NUM2=1

if [ $NUM1 -eq $NUM2 ]; then
   echo "Hai giá trị bằng nhau"
else
   echo "Hai giá trị KHÔNG bằng nhau"
fi

Kết quả:

Hai giá trị KHÔNG bằng nhau

Ví dụ 3: So sánh và xác định số lớn hơn

#!/bin/bash

NUM1=2
NUM2=1

if [ $NUM1 -eq $NUM2 ]; then
   echo "Hai giá trị bằng nhau"
elif [ $NUM1 -gt $NUM2 ]; then
   echo "NUM1 lớn hơn NUM2"
else
   echo "NUM2 lớn hơn NUM1"
fi

Kết quả:

NUM1 lớn hơn NUM2

So sánh chuỗi trong Bash

Toán tử Ý nghĩa
= bằng nhau
!= không bằng
< nhỏ hơn (theo thứ tự từ điển)
> lớn hơn (theo thứ tự từ điển)
-n s1 chuỗi s1 không rỗng
-z s1 chuỗi s1 rỗng

Ví dụ 1: Hai chuỗi khác nhau

#!/bin/bash
S1="Bash"
S2="Scripting"
if [ $S1 = $S2 ]; then
    echo "Hai chuỗi bằng nhau"
else
   echo "Hai chuỗi KHÔNG bằng nhau"
fi

Kết quả:

Hai chuỗi KHÔNG bằng nhau

Ví dụ 2: Hai chuỗi giống nhau

#!/bin/bash
S1="Bash"
S2="Bash"
if [ $S1 = $S2 ]; then
    echo "Hai chuỗi bằng nhau"
else
    echo "Hai chuỗi KHÔNG bằng nhau"
fi

Kết quả:

Hai chuỗi bằng nhau

Kiểm tra file và thư mục trong Bash

Bash cung cấp nhiều cách để kiểm tra thuộc tính của file hoặc thư mục. Dưới đây là bảng tổng hợp các tùy chọn phổ biến:

Toán tử Mô tả
-b File là file khối (block special file)
-c File là file ký tự (character special file)
-d Kiểm tra có phải là thư mục không
-e File hoặc thư mục có tồn tại không
-f File thường (không phải thư mục)
-G File tồn tại và thuộc nhóm hiện tại
-g File có thiết lập bit set-group-ID
-k File có sticky bit
-L File là liên kết mềm (symbolic link)
-O File thuộc quyền sở hữu của người dùng hiện tại
-r File có thể đọc được
-s File có dung lượng khác 0
-S File là socket
-u File có thiết lập bit set-user-ID
-w File có thể ghi
-x File có thể thực thi
#!/bin/bash
file="./file"
if [ -e $file ]; then
  echo "File tồn tại"
else
  echo "File không tồn tại"
fi

Kết quả:

$ ./filetesting.sh
File không tồn tại
$ touch file
$ ./filetesting.sh
File tồn tại

Ví dụ nâng cao: Chờ đến khi file được tạo

Script này sẽ chờ cho đến khi tệp myfile xuất hiện, sử dụng vòng lặp while và dấu ! để phủ định điều kiện:

#!/bin/bash
while [ ! -e myfile ]; do
   sleep 1
done

Script sẽ “ngủ” cho đến khi file myfile được tạo ra.

Vòng lặp trong Bash

Bash hỗ trợ nhiều loại vòng lặp để thực hiện lặp lại thao tác, gồm: for, while, và until. Dưới đây là ví dụ về từng loại:


Vòng lặp for

Script dưới đây sẽ liệt kê tất cả các files và thư mục trong thư mục /var/:

#!/bin/bash
# Vòng lặp for trong Bash
for f in $(ls /var/);do
     echo $f
done

Bạn cũng có thể thực hiện vòng lặp for ngay trong dòng lệnh mà không cần file script:

$ for f in $(ls /var/); do echo $f; done

Kết quả ví dụ:

account adm cache crash db empty ftp games gopher kerberos lib local lock log mail nis opt preserve run snap spool tmp www yp

Vòng lặp while

Vòng lặp while tiếp tục lặp cho đến khi điều kiện là sai. Ví dụ:

#!/bin/bash
COUNT=6
# Vòng lặp while
while [ $COUNT -gt 0 ]; do
    echo "Giá trị hiện tại: $COUNT"
    let COUNT=COUNT-1
done

Kết quả:

Giá trhin ti: 6
Giá trhin ti: 5
...
Giá trhin ti: 1

Vòng lặp until

until hoạt động ngược với while: nó lặp cho đến khi điều kiện là đúng.

#!/bin/bash
COUNT=0
# Vòng lặp until
until [ $COUNT -gt 5 ];do
     echo "Giá trị hiện tại: $COUNT"
     let COUNT=COUNT+1
done

Kết quả:

Giá trhin ti: 0
Giá trhin ti: 1
...
Giá trhin ti: 5

Hàm trong Bash

Bash cho phép bạn định nghĩa các hàm (functions) để tái sử dụng các khối codes. Bạn có thể định nghĩa hàm ở bất kỳ đâu trong script và gọi nó ở bất kỳ chỗ nào sau đó trong Bash.

Ví dụ: Định nghĩa và gọi hàm

#!/bin/bash
# Khai báo các hàm
function function_B {
    echo "Function B."
}
function function_A {
     echo $1
}
function function_D {
      echo "Function D."
}
function function_C {
      echo $1
}
# Gọi hàm và truyền tham số
function_A "Function A."
function_B
function_C "Function C."
function_D

Kết quả khi chạy:

$ ./functions.sh
Function A.
Function B.
Function C.
Function D.

Lệnh select trong Bash

Lệnh select cho phép tạo menu lựa chọn để người dùng chọn một giá trị từ danh sách.

Ví dụ: Menu chọn một từ

#!/bin/bash
# Đặt chuỗi nhắc người dùng
PS3='Chọn một từ: '
# Hiển thị menu và xử lý lựa chọn
select word in "linux" "bash" "scripting" "tutorial"
do
     echo "Bạn đã chọn từ: $word"
     break
done
exit 0

Kết quả khi chạy:

$ ./select.sh
1) linux
2) bash
3) scripting
4) tutorial
Chọn một từ: 2
Bạn đã chọn từ: bash

Dòng PS3 giúp thay đổi nội dung câu hỏi xuất hiện khi người dùng được yêu cầu chọn. Dòng break đảm bảo vòng lặp select chỉ chạy một lần.

Câu lệnh case trong Bash

Câu lệnh case giúp xử lý nhiều lựa chọn dễ dàng và gọn gàng hơn so với việc dùng nhiều lệnh điều kiện if/elif/else.

Ví dụ: Chọn ngôn ngữ lập trình yêu thích

#!/bin/bash

echo  "Ngôn ngữ lập trình/scripting bạn thích là gì?"
echo  "1) bash"
echo  "2) perl"
echo  "3) python"
echo  "4) c++"
echo  "5) Tôi không biết!"

read case

# Câu lệnh case xử lý từng lựa chọn
case $case in
      1) echo  "Bạn đã chọn bash";;
      2) echo  "Bạn đã chọn perl";;
      3) echo  "Bạn đã chọn python";;
      4) echo  "Bạn đã chọn c++";;
      5) exit
esac


Kết quả khi chạy:

$ ./case.sh
Ngôn ngữ lập trình/scripting bạn thích là gì?
1) bash
2) perl
3) python
4) c++
5) Tôi không biết!
3
Bạn đã chọn python

Câu lệnh case cực kỳ hữu ích khi bạn cần kiểm tra nhiều giá trị đầu vào mà không muốn dùng nhiều dòng lệnh điều kiện if.

Dấu ngoặc và ký tự đặc biệt trong Bash

Việc hiểu cách sử dụng dấu ngoặc đơn ', dấu ngoặc kép " và ký tự đặc biệt là rất quan trọng trong việc viết Bash script hiệu quả.


1. Ký tự escape (\) – loại bỏ ý nghĩa đặc biệt

Dùng \ để vô hiệu hóa (escape) ý nghĩa đặc biệt của các ký tự meta, giúp chúng được đọc theo nghĩa đen.

#!/bin/bash
BASH_VAR="Bash Script"
# In ra giá trị biến
echo $BASH_VAR
# In ra ký tự `$` theo nghĩa đen
echo \$BASH_VAR
# In ra ký tự backslash
echo "\\"

Kết quả:

Bash Script
$BASH_VAR
\

2. Dấu ngoặc đơn ' '

Dấu ngoặc đơn sẽ vô hiệu hóa tất cả ký tự đặc biệt, kể cả $, ", và \.

#!/bin/bash
BASH_VAR="Bash Script"
# In literal – không thay thế biến
echo '$BASH_VAR "$BASH_VAR"'

Kết quả:

$BASH_VAR "$BASH_VAR"

Không thể dùng dấu ' bên trong một cặp dấu '...' (ngay cả khi escape bằng \).


3. Dấu ngoặc kép " "

Dấu ngoặc kép cho phép thay thế biến ($) và sử dụng ký tự escape (\, `), nhưng vẫn giữ nguyên phần còn lại.

#!/bin/bash
BASH_VAR="Bash Script"
echo "Đây là $BASH_VAR và \"$BASH_VAR\" dùng lệnh backticks: `date`"

Kết quả:

$./BASH_VAR
Đây là Bash Script và “Bash Script” dùng lệnh backticks: [hiển thị ngày giờ hiện tại]

Dưới đây là phần tiếp theo về Phép toán số học trong Bash (Arithmetic Operations):


Phép toán số học trong Bash

Bash hỗ trợ thực hiện các phép toán như cộng, trừ, nhân, chia, chia dư, lũy thừa…


Ví dụ: Cách tính cộng đơn giản

#!/bin/bash
let RESULT1=$1+$2
echo "$1 + $2 = $RESULT1 -> # let RESULT1=$1+$2"
declare -i RESULT2
RESULT2=$1+$2
echo "$1 + $2 = $RESULT2 -> # declare -i RESULT2; RESULT2=$1+$2"
echo "$1 + $2 = $(($1 + $2)) -> # \$((\$1 + \$2))"

Chạy Script:

$ ./bash_addition_calc.sh 88 12

Kết quả:

88 + 12 = 100 -> # let RESULT1=$1+$2
88 + 12 = 100 -> # declare -i RESULT2; RESULT2=$1+$2
88 + 12 = 100 -> # $(($1 + $2))

Phép toán cơ bản với let

#!/bin/bash
echo '### let ###'
# Cộng
let ADDITION=3+5
echo "3 + 5 = $ADDITION"
# Trừ
let SUBTRACTION=7-8
echo "7 - 8 = $SUBTRACTION"
# Nhân
let MULTIPLICATION=5*8
echo "5 * 8 = $MULTIPLICATION"
# Chia
let DIVISION=4/2
echo "4 / 2 = $DIVISION"
# Chia dư
let MODULUS=9%4
echo "9 % 4 = $MODULUS"
# Lũy thừa
let POWEROFTWO=2**2
echo "2 ^ 2 = $POWEROFTWO"

Mở rộng số học Bash: $(( ))$[ ]

echo 4 + 5 = $((4 + 5))
echo 7 - 7 = $[ 7 - 7 ]
echo 3 * 2 = $((3 * 2))
echo 6 / 3 = $((6 / 3))
echo 8 % 7 = $((8 % 7))
echo 2 ^ 8 = $[ 2 ** 8 ]

Làm tròn số thực trong Bash

Sử dụng printf để làm tròn số thực:

#!/bin/bash
# Gán một số thực
floating_point_number=8.9576
echo $floating_point_number
# Làm tròn số với printf
for bash_rounded_number in $(printf %.0f $floating_point_number); do
      echo "Số sau khi làm tròn: $bash_rounded_number"
done

Kết quả:

8.9576Số sau khi làm tròn: 9

Tính toán số thực với bc

Bash không hỗ trợ tính toán số thực một cách trực tiếp, nhưng bạn có thể dùng công cụ bc:

#!/bin/bash
# Máy tính Bash đơn giản
echo "Nhập phép tính (ví dụ: 10/3.4):"
read userinput
echo "Kết quả với 2 chữ số thập phân:"
echo "scale=2; ${userinput}" | bc
echo "Kết quả với 10 chữ số thập phân:"
echo "scale=10; ${userinput}" | bc
echo "Kết quả làm tròn thành số nguyên:"
echo $userinput | bc

Kết quả ví dụ:

$ ./simple_bash_calc.sh
Nhập phép tính:
10/3.4
Kết quả với 2 chữ số thập phân:
2.94
Kết quả với 10 chữ số thập phân:
2.9411764705
Kết quả làm tròn thành số nguyên:
2

Chuyển hướng đầu ra trong Bash

Bash cho phép bạn chuyển hướng đầu ra chuẩn (STDOUT) và lỗi chuẩn (STDERR) đến các tệp hoặc lẫn nhau.


1. Chuyển STDOUT sang STDERR

#!/bin/bash
echo "Chuyển STDOUT sang STDERR" 1>&2

Thử chạy script:

$ ./redirecting.sh
Chuyển STDOUT sang STDERR
$ ./redirecting.sh > STDOUT.txt
# Không có gì trong file này vì đã chuyển sang STDERR
$ ./redirecting.sh 2> STDERR.txt
$ cat STDERR.txt
Chuyển STDOUT sang STDERR

2. Chuyển STDERR sang STDOUT

#!/bin/bash
cat $1 2>&1

Giả sử truy cập một file mà user của bạn không có quyền:

$ ./redirecting.sh /etc/shadow > output.txt
$ cat output.txt
cat: /etc/shadow: Permission denied

3. Chuyển hướng stdout mặc định ra màn hình

$ touch file1
$ ls file1
file1

4. Ghi stdout vào file

$ ls file1 > STDOUT
$ cat STDOUT
file1

5. Ghi stderr vào file

$ ls file2 2> STDERR
$ cat STDERR
ls: cannot access file2: No such file or directory

6. Ghi cả stdoutstderr vào cùng một file

$ ls file1 file2 > STDERR_STDOUT 2>&1
$ cat STDERR_STDOUT
ls: cannot access file2: No such file or directory
file1

Hoặc cách viết khác:

$ ls file1 file2 &> STDERR_STDOUT

Kết luận

Trong hướng dẫn Bash này, bạn đã học:

  • Cách viết script cơ bản và nâng cao

  • Cách dùng biến, vòng lặp, hàm, xử lý lỗi

  • Cách xử lý file, phép toán, chuỗi, và chuyển hướng đầu ra

Với những kiến thức này, bạn có thể tạo ra các Bash script tùy chỉnh để tự động hóa các tác vụ hiệu quả cho công việc của bạn trong Linux.

Ngoài ra để biết được cách tạo một script hiển thị các thông tin quan trọng của một Linux Server bạn có thể tham khảo thêm về Hướng dẫn Viết Bash Script Để Hiển Thị Thông Tin Hệ Thống Linux

Đừng quên chia sẻ nếu bạn thấy bài viết hữu ích!
Hãy theo dõi blog để cập nhật nhiều bài viết có hướng dẫn chuyên sâu hơn.

#BashScripting #HướngDẫnLậpTrìnhShell#LậpTrìnhBash#TựĐộngHóaLinux#ViếtScriptLinux#LậpTrìnhShellLinux#BashScriptChoNgườiMớiBắtĐầu

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *