Đơn giản hóa tác vụ trong Linux với Bash script (phần 1)

Mở đầu

Với những người dùng thường xuyên sử dụng các hệ điều hành Linux cho công việc thì việc thao tác với các dòng lệnh là điều cần thiết và rất quan trọng. Tuy nhiên bất kì ai đã, đang hoặc từng sử dụng Linux thì đều nhận ra các điều sau đây:

  1. Các chương trình chỉ làm được một công việc đơn giản và không thể làm 2 công việc khác nhau trở lên
  2. Các chương trình phải hoạt động theo một thứ tự nhất định để thực hiện một công việc nào đó và nếu thay đổi thứ tự này sẽ dẫn đến việc xử lý công việc khác.
  3. Có một số công việc phải làm với tất suất rất lớn và đôi khi là lặp đi lại trong thời gian ngắn.

Vấn đề này làm cho Bash script trở nên vô cùng hữu ích. Các script viết ra có thể đảm nhiệm được một công việc ngay lập tức thay vì phải gõ lại một loạt các câu lệnh phức tạp. Việc này có thể rút ngắn được thời gian làm việc trên Linux tuy nhiên cần mất công học thêm một ngôn ngữ kịch bản lệnh - Bash script.

Bash script là gì

Bash script là một loại ngôn ngữ kịch bản (tương tự như Perl, Python, Lua ...), thường được viết bởi con người và thực thi bởi máy tính. Cũng giống như các ngôn ngữ khác, Bash script cũng có riêng một trình thông dịch đó là BASH (Bourne Again SHell). Có 2 cách để Bash script được thực thi:

  • Chạy từng dòng một trên cửa sổ Terminal hoặc tty (ta sẽ không cần quan tâm cách này vì thực tế nó không khác với việc chạy từng câu lệnh để hoàn thành 1 tác vụ nào đó)
  • Viết tất cả các câu lệnh cần thiết vào một file Bash (*.sh) và thực thi nó.

Tất nhiên ta cũng có thể cấp quyền thực thi cho file bash đó để nó có thể chạy như một chương trình. Bạn có thể tham khảo thêm trong bài viết Cơ bản về phân quyền cho file trong Linux (phần 2) để cấp quyền thực thi cho file đó.

Ví dụ một file Bash

Ở đây tôi có một file bash đơn giản với nội dung như trong hình:

File này khi thực thi sẽ chỉ in ra dòng chữ Hello World.

Những điểm quan trọng cần lưu ý của một Bash script

Dãy kí tự #! (shebang)

Dòng chứa kí tự này sẽ là dòng thông báo cho hệ điều hành biết file script này sẽ được thực thi bởi chương trình nào. Trong trường hợp bạn không biết chính xác trình thông dịch của Bash nằm ở đâu, bạn có thể dùng which bash:

Đặc tên file

Có thể nói rằng file Bash script không yêu cầu bất cứ một điều kiện gì ngoại trừ điều kiện của hệ điều hành để đặt tên file. Bất kể một tên gì cũng được chấp nhận, phần mở rộng cũng không quan trọng. Lấy ví dụ, bạn có thể đặt tên file Bash scriptmy_document.jpg.

Comment

Là những dòng lệnh chỉ có tác dụng chỉ dẫn hoặc mô tả và sẽ được bỏ qua trong file Bash, những dòng này sẽ được bắt đầu bằng dấu # (she). Cần lưu ý là không nên lạm dụng comment, chỉ cần những lúc thực sự cần thiết, quá nhiều comment có thể làm cho người đọc file thấy khó khăn trong việc tìm hiểu công việc được thực thi với file này là gì.

Variable trong Bash

Variable (hay biến) là khái niệm dùng để chỉ các phần dữ liệu được lưu trữ tại một ô nhớ cụ thể trong bộ nhớ máy tính và có thể gọi trực tiếp thông qua tên (VD một biến gọi là shell_name có giá trị là "Bash"). Việc đặt tên biến có ý nghĩa quan trọng trong việc truy cập dữ liệu và tăng khả năng kiểm soát chương trình, đồng thời dễ dàng giải phóng tài nguyên sau khi không còn sử dụng. Trong Bash script, có 2 quy ước khi sử dụng biến:

  • Để khai báo một biến, ta sử dụng ký hiệu equal (=) đặt giữa tên và giá trị của biến (không được đặt bất cứ dấu space () nào ở trước hoặc sau =.
    VD: name='Viblo', description='Knowledge sharing site'
  • Để truy cập tới một biến, ta sử dụng ký hiệu dollar ($) ở ngay trước tên biến đó.
    VD: $name, $description

Một số chương trình cần truyền tham số dòng lệnh vào để sử dụng, Bash cho phép sử dụng một số biến đặc biệt sau:

  • $0: Tên của file script.
  • $1 -> $9: Các tham số truyền vào
  • $#: Số lượng của tham số truyền vào
  • $*: Danh sách các tham số được truyền vào
    (các trường hợp $#$* sẽ không bao gồm $0)

Đặc biệt, có thể lưu đầu ra của một câu lệnh khác vào một biến bằng cách sử dụng một trong 2 cách sau:

  • Dùng dấu backtick
var_name=`command`
  • Dùng dấu dollar
var_name=$(command)

VD:

Câu lệnh điều kiện

Với mọi ngôn ngữ lập trình hiện đại ngày nay, câu lệnh điều kiện là một tính năng không thể thiếu. Tính năng này dùng để đưa ra quyết định về các lệnh sẽ được thực hiện dựa theo các điều kiện cho trước. Những từ khóa if hay else không còn xa lạ với những người thường xuyên tiếp xúc với máy tính với các công việc là lập trình.

Bash hỗ trợ 3 dạng của câu lệnh điều kiện:

  • Dạng đơn giản: chỉ bao gồm một điều kiện, tùy theo điều kiện đúng hay sai mà sẽ thực hiện câu lệnh cụ thể
if conditional ; then
    statement_1
else
    statement_2
fi
  • Dạng đầy đủ: bao gồm từ 2 điều kiện trở lên
if conditional_1 ; then
    statement_1
elif conditional_2 ; then
    statement_2
else
    statement_3
fi
  • Dạng mở rộng: có nhiều điện lồng nhau (nested)
if conditional_1; then
    if conditional_2; then
        statement_1
    else
        statement_2
    fi
fi

Thông trường conditional của câu lệnh if có thể được dùng dưới 2 dạng:

  • Dùng test command: test expression
  • Dùng [] symbol: [ expression ]

Một số ví dụ:

if [ $var = "true" ] ; then
    echo "Hello World!"
else
    exit
fi
file="/usr/sbin/bash"

if [ -f $file ]; then
    echo "$file is a regular file"
elif [ -d $file ]; then
    echo "$file is a directory"
else
    echo "$file is neither a file nor a directory"
fi

Lời kết

Trong phần 1 của bài viết này tôi đã giới thiệu về Bash script và các vấn đề liên quan đến sử dụng biến hoặc câu lệnh điều kiện. Trong phần 2 tôi sẽ tiếp tục giới thiệu về các vấn đề khác của Bash script như luồng điều khiển (Flow control) và các lệnh tiện ích của Bash (alias, getopts ...). Cảm ơn mọi người đã đọc bài viết

Tài liệu tham khảo