LapTrinhBlockchain

Chia sẻ kiến thức về Lập Trình Blockchain

Kiến thức lập trình, Kiến thức phần mềm, Nâng cao Kiến thức

Lập trình Shell Script trên Linux/Ubuntu

Lập trình Shell Script trên Linux/Ubuntu

Lập trình Shell Script trên Linux/Ubuntu

Chia sẻ bài viết
5
(68)

Shell là trình thông dịch của Linux, thực hiện các lệnh của người dùng thông qua Terminal hoặc thực hiện lệnh trong tệp. Shell Script là tệp chứa tập hợp các lệnh Shell. Bài này sẽ từng bước hướng dẫn các bạn viết một Shell Script. Ngoài ra bạn nên xem bài viết Một số lệnh hay dùng trên Linux/Ubuntu để viết Shell Script linh hoạt hơn.

Tạo và chạy một Shell Script

Shell Script là một tệp dạng text chứa chuỗi các lệnh Shell. Để tạo một Shell Script, bạn có thể sử dụng một trình soạn thảo văn bản Text Editor bất kỳ. Bảng dưới liệt kê các trình soạn thảo hay sử dụng:

  • Vi, Vim (Dòng lệnh): Vi là trình soạn thảo mặc định trên hệ điều hành Unix. Vi nổi tiếng vì cấu trúc lệnh khó và không trực quan của nó. Nhưng mặt khác nó rất mạnh, nhẹ và nhanh. Phiên bản cải tiến của Vi là Vim, cũng có trên hầu hết trên các bản Linux.
  • Emacs (Dòng lệnh + Giao diện): Emacs (Editing Macros)  của Richard Stallman là người khổng lồ thực sự trong thế giới của các trình soạn thảo văn bản. Emacs chứa mọi tính năng cần thiết cho một trình soạn thảo văn bản. Trên Ubuntu bạn có thể sử dụng lệnh sau để cài đặt:
    sudo apt-get install emacs
  • nano (Dòng lệnh): nano là trình soạn thảo văn bản miễn phí, rất dễ sử dụng, nhưng rất ít tính năng. nano thường sử dụng để soạn thảo các văn bản đơn giản.Trên Ubuntu, bạn có thể sử dụng lệnh sau để cài đặt:
    sudo apt-get install nano
  • gedit (Giao diện): gedit là trình soạn thảo trực quan mặc định trên hệ điều hành Linux.
  • kwriter (Giao diện): kwriter là trình soạn thảo tiên tiến hơn. Nó hỗ trợ tô sáng cú pháp (syntax highlighting), một tính năng rất hữu ích cho các lập trình viên và các nhà chuyên viết script.
  • Notepad++ (Giao diện): Trình soạn thảo tiên tiến hỗ trợ tô sáng cú pháp.

Ngoài ra còn nhiều trình soạn thảo văn bản mạnh khác, nhưng hầu hết đều là các phiên bản thương mại.

Bây giờ, bạn mở trình soạn thảo văn bản, soạn thảo một tệp hello.sh có nội dung như sau:

#!/bin/bash
# My first script

echo "Hello World!"

Bây giờ ta sẽ đi vào chi tiết từng dòng lệnh trong tệp:

  • Dòng đầu tiên: Dòng này rất quan trọng, nó là một chỉ dẫn đặc biệt gọi là “shebang“. Nó xác định ứng dụng thực hiện thông dịch tệp này, trong trường hợp này là /bin/bash. Dòng này có thể không cần, nhưng nên có thì tốt hơn. Các ngôn ngữ kịch bản khác như PerlawktclTk, và python cũng sử dụng cơ chế này.
  • Dòng thứ hai: Dòng này là một chú thích (Comment). Mọi thứ xuất hiện sau kí tự # được bỏ qua bởi bash. Với các Shell Script phức tạp thì chú thích rất quan trọng, nó giúp cho người khác hiểu được script tiếp theo sẽ làm gì.
  • Dòng cuối cùng: Là lệnh echo để hiển thị một đoạn text lên màn hình.

Để chạy tệp Shell Script này bạn có thể sử dụng một trong các lệnh sau:

bash hello.sh
sh hello.sh
. hello.sh
source hello.sh

Bạn có thể chạy trực tiếp tệp này nếu bạn chuyển nó sang dạng có thể thực thi:

chmod +x hello.sh
./hello.sh

Ngoài ra nếu bạn di chuyển tệp này tới thư mục /bin thì bạn chỉ cần đánh lệnh sau để chạy:

sudo mv hello.sh /bin
hello.sh

Ngoài ra, bạn có thể thêm đường dẫn tới tệp này vào biến môi trường PATH (Ví dụ dưới tệp hello.sh trong thư mục /home/ubuntu/work/test):

export PATH=$PATH:/home/ubuntu/work/test
hello.sh

Môi trường được thiết lập như thế nào?

Khi bạn đăng nhập vào hệ thống, ứng dụng bash sẽ khởi động và nó chạy một chuỗi các script cấu hình gọi là “startup files“. Chúng xác định môi trường mặc định cho tất cả người dùng. Tiếp đó, nó chạy các “startup files” trong thư mục của người dùng để định nghĩa môi trường riêng cho người dùng đó. Chuỗi “startup files” thực sự phụ thuộc vào loại shell session. Có hai loại:

  • login shell session: Phiên yêu cầu bạn phải sử dụng username và password để đăng nhập. Thường khi bạn đăng nhập vào hệ thống.
  • non-login shell session: Không phải sử dụng usename và password để đăng nhập. Trường hợp này thường xảy ra khi bạn chạy một Terminal trong chế độ GUI. Loại này cũng kế thừa môi trường từ tiến trình cha của chúng, thường là từ một “login shell“.

Chi tiết các tệp cấu hình cho từng loại session như sau:

  • Login shell session:
    • /etc/profile: Một tệp cấu hình áp dụng cho tất cả người dùng.
    • ~/.bash_profile: Một tệp cấu hình riêng cho từng người dùng. Có thể được sử dụng để mở rộng hoặc ghi đè các thiết lập trong tệp cấu hình chung.
    • ~/.bash_login: Nếu không tìm thấy tệp ~/.bash_profile, thì tệp cấu hình này sẽ được sử dụng.
    • ~/.profile: Nếu không tìm thấy tệp ~/.bash_profile hay ~/.bash_login, tệp cấu hình này sẽ được sử dụng.
  • Non-login shell session:
    • /etc/bash.bashrc: Tệp cấu hình áp dụng cho tất cả người dùng.
    • ~/.bashrc: Một tệp cấu hình riêng cho từng người dùng. Có thể được sử dụng để mở rộng hoặc ghi đè các thiết lập trong tệp cấu hình chung.

Để hiểu rõ hơn, bạn hãy thử mở các tệp này để xem.

Một số vấn đề cơ bản về Shell trong Linux

Bí danh (Aliases)

Bí danh (Alias) là cú pháp tạo ra một bí danh viết tắt cho một từ dài. Đây là một cách dễ dàng để tạo một lệnh mới. Cú pháp như sau:

alias name=value

Trong đó, name bí danh hay là lệnh mới, còn value lệnh sẽ được thực hiện. Ví dụ sau sẽ tạo lệnh mới “lsa” và chạy thử lệnh này:

alias lsa='ls -la'
lsa

Ví dụ sau sẽ tạo lệnh mới “today” và chạy thử lệnh này:

alias today='date +"%A, %B %-d, %Y"'
today

Việc tạo các alias này nên đặt trong các “startup file“, như vậy bạn có thể sử dụng trong mọi shell session.

Trích dẫn (quote) trong Shell

Trong Shell hỗ trợ ba loại trích dẫn (quote):

  • Dấu nháy kép (double quote “): Tất cả các kí tự trong dấu ngoặc kép đều không có ý nghĩa tính toán trừ những kí tự sau kí tự \ và $
  • Dấu nháy đơn (single quote ‘): Tất cả các kí tự trong dấu ngoặc đơn đều không có ý nghĩa tính toán.
  • Dấu nháy ngược (back quote `): Yêu cầu thực hiện lệnh

Ví dụ:

echo "Today is date" => In ra chuỗi: Today is date
echo "Today is `date`" => In ra chuỗi: Today is Tue Jan....
echo "PATH=$PATH" => In ra chuỗi: PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin:...
echo 'PATH=$PATH' => In ra chuỗi: PATH=$PATH

Wildcards

Nhiều lệnh trong Shell sử dụng Wildcards như ls, rm, . Vì thế các bạn nên hiểu chút về Wildcards. Một xâu wildcards sẽ có thể có một số kí tự đặc biệt sau:

  • *: Tương ứng với một chuỗi kí tự bất kỳ. Ví dụ:
    • ls * => Hiển thị tất cả các tệp
    • ls a* => Hiển thị tất cả các tệp có tên bắt đầu bằng kí tự a.
    • ls *.c => Hiển thị tất cả các tệp có phần mở rộng là c.
  • ?: Tương ứng với một kí tự bất kỳ. Ví dụ:
    • ls ? => Hiển thị tất cả các tệp mà tên của nó có chiều dài là 1 kí tự.
    • ls fo? => Hiển thị tất cả các tệp mà tên của nó có 3 kí tự và bắt đầu bằng “fo”.
  • […]: Tương ứng một kí tự bất kỳ có trong dấu ngoặc vuông. Sử dụng kí tự – khi muốn thể hiện một chuỗi. Ví dụ:
    • ls [abc]* => Hiển thị tất cả các tệp có tên bắt đầu bằng một trong các kí tự a hoặc b hoặc c.
    • ls [a-c]* => Hiển thị tất cả các tệp có tên bắt đầu bằng một trong các kí tự a hoặc b hoặc c. (Tương đương với lệnh trên)
  • ! hoặc ^: Thể hiện ý nghĩa phủ định. Ví dụ:
    • ls /bin/[!a-o]* => Hiển thị tất cả các file trong thư mục /bin mà ký tự đầu tiên không phải là a, b, c…o.
    • ls /bin/[^a-o]* => Hiển thị tất cả các file trong thư mục /bin mà ký tự đầu tiên không phải là a, b, c…o (Tương đương lệnh trên)

Nhiều lệnh trên một dòng lệnh

Thông thường mỗi lệnh trên một dòng, trong trường hợp bạn muốn thực hiện nhiều lệnh trên một dòng hãy sử dụng kí tự chấm phẩy để ngăn cách các lệnh. Cú pháp như sau:

command1;command2;...

Ví dụ lệnh sau sẽ in ra ngày hiện tại và tên người dùng đăng nhập hiện tại:

date;who

Chuyển hướng

Hầu hết các lệnh đều nhận tham số từ bàn phím và kết xuất ra màn hình. Nhưng Linux cho phép lấy dữ liệu từ tệp và kết xuất dữ liệu ra tệp thông qua sử dụng kí tự điều hướng. Các kí tự điều hướng gồm:

Kí tự >:

Cho phép kết xuất kết quả của lệnh ra tệp. Cú pháp dạng:

command > filename

Nếu như tệp filename tồn tại, nó sẽ được ghi đè, nếu không có nó sẽ được tạo mới. Ví dụ:

ls -al > list-file.txt

Kí hiệu >>: Cho phép kết xuất kết quả của lệnh vào cuối tệp. Cú pháp dạng:

command >> filename

Nếu như tệp tồn tại, nó sẽ được mở và thông tin mới được ghi thêm vào cuối tệp, không sợ mất dữ liệu/thông tin trước. Và nếu tệp không tồn tại, thì tệp mới được tạo. Ví dụ:

date >> myfiles

Kí tự <: Nhận dữ liệu từ file hoặc kết quả từ lệnh khác thay vì từ bàn phím. Cú pháp dạng:

command < filename

Ví dụ:

cat < myfiles

# Lệnh sort lấy dữ liệu từ file tên là sname và kết xuất kết quả ra file tên là sorted_names.
sort < sname > sorted_names

Cơ chế đường ống Pipe

Pipe là một nơi lưu tạm kết xuất của một lệnh và sau đó chuyển vào input của lệnh thứ hai. Pipe được sử dụng để chạy nhiều hơn 2 lệnh trên cùng một dòng lệnh. Bạn sử dụng kí tự | khi sử dụng với Pipe. Cú pháp như sau:

command1 | command2 | command3 ...

Khi đó kết quả của lệnh 1 sẽ là đầu vào cho lệnh 2, và kết quả lệnh 2 sẽ làm đầu vào cho lệnh 3…

Ví dụ lệnh sau sẽ in ra màn hình dữ liệu từ dòng 20 đến 30 của tệp hotel.txt:

# Lệnh này in ra màn hình dòng từ 20 đến 30 của tệp hotel.txt
tail -n+20 < hotel.txt | head -n11

Cơ bản về Shell Script

Biến trong Shell

Các biến sẽ giúp giảm bớt việc lặp lại các text trong Shell Script. Trong Linux Shell có hai loại biến:

  • Biến hệ thống: Được tạo ra và quản lý bởi hệ thống. Tên biến là CHỮ HOA.
  • Biến người dùng: Biến do người dùng tự định nghĩa. Tên biến thường là chữ thường.

Bạn có thể xem biến môi trường bằng một trong hai lệnh sau:

env
printenv

Để định nghĩa một biến, bạn sử dụng cú pháp sau:

name=value

Trong đó:

  • name là tên biến. Tên biến là chuỗi các kí tự chữ, số và gạch dưới. Tên biến phải bắt đầu bằng kí tự, và không có dấu cách hoặc các kí tự đặc biệt như *,?. Tên biến có phân biệt hoa thường.
  • value là giá trị cần thiêt lập cho biến.

Các bạn cần chú ý rằng: Không có kí tự trắng giữa hai bên dấu bằng khi gán giá trị cho biến.

Bạn có thể định nghĩa biến NULL bằng một trong các lệnh sau:

vech=
vech=""

Để truy cập vào một biến bạn sử dụng kí tự $ trước tên biến:

$PATH
$vech

Sử dụng lệnh echo để in giá trị biến:

echo $PATH
echo $vech

Các hàm trong Shell

Alias rất hữu ích với các lệnh đơn giản, nhưng nếu bạn muốn tạo những thứ phức tạp hơn, hãy viết các hàm shell (Shell Function). Shell Function như là “scripts within scripts“.

Bây giờ bạn mở tệp “.bashrc” và thêm vào cuối tệp đoạn sau:

today() {
    echo -n "Today's date is: "
    date +"%A, %B %-d, %Y"
}

Bây giờ bạn mở Terminal và chạy lệnh today, bạn sẽ thấy kết quả.

Trạng thái kết thúc một lệnh hay một Shell Script

Mặc định trong Linux, nếu lệnh hoặc Shell Script được thực thi, nó sẽ trả về giá trị (Exit status) được sử dụng để xem Lệnh/Shell Script được thực thi thành công hay không? Bạn sử dụng lệnh $? để lấy giá trị trả về này, nhận một trong hai loại giá trị:

  • 0: Nếu câu lệnh kết thúc thành công
  • Khác 0: Có lỗi xảy ra khi thực thi lệnh

Bạn thử chạy hai lệnh sau trong trường hợp tệp unknow1file tồn tại và không tồn tại:

rm unknow1file
echo "Exit status: $?"

Truyền tham số vào một Shell Script

Một Shell Script có thể có các tham số được truyền vào dòng lệnh. Ví dụ lệnh sau:

./hello.sh foo bar ...

Trong tệp Shell Script hello.sh, bạn sử dụng kí tự $ và theo sau là một số để lấy các tham số này. Cụ thể:

  • $0: Tên lệnh, chính là “./hello.sh
  • $1$2$3, …: Các tham số theo thứ tự tương ứng
  • $#: Số lượng các tham số
  • $* hoặc $@: Tham chiếu đến các tham số được chuyển đến Shell Script.

Ví dụ đoạn Shell Script sum tinh tổng hai số:

#!/bin/bash

sum=`expr $1 + $2`
echo "sum = $sum"

Chạy lệnh sau để thử:

./sum 5 8

Một số cấu trúc thông dụng

Lệnh test và biểu thức điều kiện

Lệnh test được dùng để kiểm tra một biểu thức là đúng hay không và trả lại:

  • 0 nếu biểu thức đúng
  • <>0 cho trường hợp còn lại

Cú pháp lệnh như sau:
test biểu_thức_điều_kiện
Biểu thức có thể các phép toán trên số, xâu và file.

Ngoài ra bạn cũng có thể sử dụng dạng sau khi muốn kiểm tra một điều kiện:

[ biểu_thức_điều_kiện ]

Cú pháp này tiện hơn nên được sử dụng nhiều hơn.

Bảng sau liệt kê danh sách các toán tử thao tác với biểu thức toán học trong Shell Script:

Toán tử so sánhÝ nghĩaLệnh so sánh thông thườngLệnh so sánh trong Shell Script
Cho lệnh testCho lệnh [ expr ]
-eqBằng5 == 6if test 5 -eq 6if [ 5 -eq 6 ]
-neKhông bằng5 != 6if test 5 -ne 6if [ 5 -ne 6 ]
-ltNhỏ hơn5 < 6if test 5 -lt 6if [ 5 -lt 6 ]
-leNhở hơn hoặc bằng5 <= 6if test 5 -le 6if [ 5 -le 6 ]
-gtLớn hơn5 > 6if test 5 -gt 6if [ 5 -gt 6 ]
-geLớn hơn hoặc bằng5 >= 6if test 5 -ge 6if [ 5 -ge 6 ]

Bảng sau liệt kê danh sách các toán tử thao tác với xâu trong Shell Script:

Toán tửÝ nghĩa
string1 = string2string1 bằng string2
string1 != string2string1 không bằng string2
string1string1 khác rỗng hoặc chưa được định nghĩa
-n string1string1 đã tồn tại và khác rỗng
-z string1string1 đã tồn tại và rỗng

Bảng sau liệt kê danh sách các toán tử thao tác với tệp/thư mục trong Shell Script:

Toán tửÝ nghĩa
-s fileTệp khác rỗng
-f fileTệp đã tồn tại và là kiểu file
-d dirTệp đã tồn tài và là kiểu thư mục
-w fileTệp được phép ghi
-r fileTệp chỉ được phép đọc
-x fileLà tệp thực thi

Bảng sau liệt kê các phép toán logic sử dụng trong Shell Script:

Toán tửCú phápÝ nghĩa
 !! Biểu_thứcNOT
-aBiểu_thức_1 –a Biểu_thức_2AND
-oBiểu_thức_1 –o Biểu_thức_2OR

Ví dụ:

if [ $1 -gt 5 -a $2 -gt 5 ]
then
    echo "Two parameters are both greater then 5"
fi

if [ $1 -gt 2 ] -a [ $2 -gt 2 ]
then
    echo "One of two parameters are both greater then 2"
fi

Ngoài ra bạn bạn có thể sử dụng && (Cho AND) và || (Cho OR):

if [ $1 -gt 5 && $2 -gt 5 ]
then
    echo "Two parameters are both greater then 5"
fi

if [ $1 -gt 2 ] || [ $2 -gt 2 ]
then
    echo "One of two parameters are greater then 2"
fi

Cấu trúc rẽ nhánh if

Cú pháp đầy đủ như sau:

if điều_kiện_1
then
    câu_lệnh_1
    ...
elif điều_kiện_2
then
    câu_lệnh_2
    ...
elif điều_kiện_3
then
    câu_lệnh_3
    ...
else
    câu_lệnh_khác
fi

Trong cú pháp này nếu chỉ có 1 điều kiện thì không cần sử dụng elif, nếu không xử lý trường hợp else thì không cần nhánh này.

Ví dự tệp shell script ispositive sau kiểm tra xem tham số truyền vào có phải là số nguyên dương không:

#!/bin/sh
#
# Script to see whether argument is positive
#
if test $1 -gt 0
then
    echo "$1 number is positive"
fi

Ngoài ra bạn sử dụng cú pháp [ expr ] như sau:

#!/bin/sh
#
# Script to see whether argument is positive
#
if [ $1 -gt 0 ]
then
    echo "$1 number is positive"
fi

Cấu trúc case

Cú pháp đầy đủ như sau:

case $variable-name in
    pattern1)
        command
        ...
        command;;
    pattern2)
        command
        ...
        command;;
    patternN)
        command
        ...
        command;;
    *)
        command
        ...
        ...
        command;;
esac

Ví dụ shell script test-case sau:

# if no vehicle name is given
# i.e. –z $1 is defined and it is NULL
#
# if no command line arg
if [ -z $1 ]
then
    rental="*** Unknown vehicle ***"
elif [ -n $1 ]
then
    rental=$1
fi
case $rental in
    "car")
        echo "For $rental Rs.20 per k/m";;
    "van")
        echo "For $rental Rs.10 per k/m";;
    "jeep")
        echo "For $rental Rs.5 per k/m";;
    "bicycle")
        echo "For $rental 20 paisa per k/m";;
    *)
        echo "Sorry, I can not gat a $rental for you";;
esac

Bạn thử chạy bằng các lệnh sau:

./test-case car
./test-case bicycle
./test-case truck

Cấu trúc lặp while

Cú pháp như sau:

while [ condition ]
do
    command1
    command2
    command3
    ...
done

Ví dụ script test-while như sau:

#!/bin/sh
#
# Script to test while statement
##
if [ $# -eq 0 ]
then
    echo "Error - Number missing form command line argument"
    echo "Syntax : $0 number"
    echo " Use to print multiplication table for given number"
    exit 1
fi

n=$1
i=1
while [ $i -le 10 ]
do
    echo "$n * $i = `expr $i \* $n`"
    i=`expr $i + 1`
done

Bạn chạy thử bằng lệnh:

./test-while 5

Màn hình bạn sẽ thấy:

5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
5 * 6 = 30
5 * 7 = 35
5 * 8 = 40
5 * 9 = 45
5 * 10 = 50

Cấu trúc lặp for

Cú pháp lệnh này như sau:

for VARIABLE in 1 2 3 4 5 .. N
do
    command1
    command2
    commandN 
done

Hoặc:

for VARIABLE in file1 file2 file3
do
    command1 on $VARIABLE
    command2
    commandN
done

Hoặc:

for OUTPUT in $(Linux-Or-Unix-Command-Here)
do
    command1 on $OUTPUT
    command2 on $OUTPUT
    commandN
done

Hoặc cú pháp với 03 điều kiện:

for (( EXP1; EXP2; EXP3 ))
do
    command1
    command2
    command3
done

Ví dụ dưới hiển thị thông báo 5 lần:

#!/bin/bash
for i in 1 2 3 4 5
do
    echo "Welcome $i times"
done

Với Bash phiên bản 3.0 trở lên, bạn sử dụng cú pháp {START..END} (Danh sách các số từ START tới END với bước nhảy là 1). Nhưng cú pháp này thì START và END phải là các số, không hỗ trợ biến:

#!/bin/bash
for i in {1..5}
do
    echo "Welcome $i times"
done

Từ Bash phiên bản 4.0 trở lên, hỗ trợ với step bất kỳ theo cú pháp {START..END..INCREMENT}:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
do
    echo "Welcome $i times"
done

Với biến bạn có thể sử dụng lệnh seq để tạo danh sách giá trị:

#!/bin/bash
NUM=20
for i in $(seq 1 2 $NUM)
do
    echo "Welcome $i times"
done

Hoặc sử dụng lệnh theo cú pháp ba biểu thức:

#!/bin/bash
NUM=20
for (( i=1; i<$NUM; i+ ))
do
    echo "Welcome $i times"
done

Một số lệnh Shell hay sử dụng

Lệnh echo: In ra màn hình

Cú pháp lệnh như sau:

echo [option] [string, variables…]

Bạn sử dụng tham số -e để in một số kí tự đặc biệt:

  • \a: alert (bell)
  • \b: backspace
  • \c: suppress trailing new line
  • \n: new line
  • \r: carriage return
  • \t: horizontal tab
  • \\: backslash

Ví dụ:

echo -e "Anappleadaykeepsaway\a\t\tdoctor\n"

Lệnh expr: Tính toán biểu thức toán học

Cú pháp lệnh:

expr biểu_thức_số_học

Trong đó, biểu thức số học là biểu thức toán học cần tính. Các toán tử hỗ trợ gồm: +\* (nhân), /%Các bạn cần chú ý: Phải có dấu cách trước và sau các toán tử. Một số ví dụ:

expr 1 + 3
expr 8 + 10 / 2
expr 20 % 3 + 4 \* 3
echo `expr 6 + 3`

Lệnh read: Đọc dữ liệu từ bàn phím

Cú pháp lệnh:

read variable1, variable2,...variableN

Đoạn script sau sẽ yêu cầu người dùng nhập tên và hiển thi thông báo:

# Script to read your name from key-board
echo "Your first name please:"
read fname
echo "Hello $fname, Lets be friend!"

Lệnh phân tách xâu (string) thành mảng (array)

Nếu phân tách xâu thành mảng trong đó dấu phân cách là dấu CÁCH (Space) thì chúng ta chỉ cần đặt xâu trong cặp dấu đóng mở ngoặc:

data="Bitcoin is the first decentralized cryptocurrency"
items=($data)
echo ${items[4]} 

Trường hợp kí tự phân tách không phải dấu CÁCH (Space) thì ta sử dụng readarray:

# Phân tích đường dẫn thành mảng
readarray -d / items <<< "/home/arbitron/temp/test.txt"

# Xác định số phần tử của mảng
num=${#items[@]}
echo $num

# Truy cập tới phần tử trong mảng
echo ${items[1]}
echo ${items[4]}

Lấy ngày giờ hiện tại theo định dạng “yyyy-mm-dd HH:MM:SS”

date '+%Y-%m-%d %H:%M:%S'

Viết một số Shell Script hay dùng trong thực tế

Viết script định kỳ 5 phút 1 lần lấy thông tin lượng Storage đang sử dụng và lưu ra tệp csv

Nhưng đã biết để lấy thông tin dung lượng đang sử dụng ta dùng lệnh sau:

df -h
------------------
Filesystem       Size  Used Avail Use% Mounted on
/dev/root        2.5T  230G  2.3T  10% /
tmpfs             16G     0   16G   0% /dev/shm
tmpfs            6.2G  860K  6.2G   1% /run
tmpfs            5.0M     0  5.0M   0% /run/lock
/dev/nvme0n1p15  105M  6.1M   99M   6% /boot/efi
tmpfs            3.1G  4.0K  3.1G   1% /run/user/1000

Chúng ta sẽ parse dữ liệu này để được dữ liệu mong muốn:

#!/bin/bash
snapshotStorage() {
    data=$(df -h | grep "/dev/root")
    items=($data)
    time=$(date '+%Y-%m-%d %H:%M:%S')
    line="$time,${items[1]},${items[2]},${items[4]}"
    echo $line
    echo $line >> storage_statics.csv
}

while true
do
    snapshotStorage
    sleep 5m
done

Nguồn tham khảo: Linux Bash Shell Scripting Tutorial

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 68

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

Trả lời

Giao diện bởi Anders Norén