This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

Kiểu khi viết kịch bản Bash/Bourne

Dưới đây là kiểu khi viết các kịch bản Bash/Bourne, do Kỳ Anh đề nghị. Việc tuân theo các tiêu chuẩn là cần thiết để theo dõi, bảo trì và chia sẻ kịch bản. Vui lòng đặt vấn đề mới để góp ý và thảo luận, để hoàn thiện tiêu chuẩn này.

Tên hằng, biến

  1. Các biến toàn cục (có thể gọi là hằng) có tên gồm chữ viết hoa, con số, dấu gạch chân, bắt đầu bằng dấu gạch chân (_). Nếu các hằng và biến này chỉ được dùng bên trong một thư viện (điều này không khuyến khích), hãy đặt tên bắt đầu hai dấu gạch chân __.
  2. Các biến địa phương có tên gồm các chữ, số viết thường, sử dụng các tiền tố để phân loại: f_ chỉ tên tập tin, d_ chỉ tên thư mục, ...
  3. Sử dụng dấu gạch chân để phân cách động từ và danh từ, không nên viết liền các động từ và danh từ
  4. Các chữ cái trong tên biến hoặc tất cả là chữ hoa, hoặc tất cả là chữ thường
  5. Chỉ sử dụng các từ tiếng Anh để đặt tên cho biến, với các danh từ được sử dụng đúng số nhiều hoặc ít

Ví dụ

 1 # các biến toàn cục, các hằng
 2 _MAILTO="[email protected]" 
 3 _PASSWORD="chìa khóa" 
 4 
 5 # các biến địa phương
 6 f_tmp="/tmp/anyfile" 
 7 d_src="/home/backup/source" 
 8 d_dest="/home/backup/destination" 
 9 a_assoc[A]="associate array" 

Hàm. Tên hàm

  1. Đối với thư viện hàm
    1. Các hàm nội bộ bắt đầu bằng hai dấu gạch __
    2. Các hàm xuất ra để sử dụng ở bên ngoài có tên bắt đầu bằng một dấu gạch _
  2. Đối với một kịch bản cụ thể, tTất cả các hàm sử dụng nội bộ có tên bắt đầu một dấu gạch _
  3. Tất cả các chữ cái của hàm đều là chữ thường

Ví dụ

1 _msg() {
2   echo ":: $*" 
3 }
4 
5 __internal_function() {
6   echo "This is an internal function" 
7 }

Tùy chọn

  1. Bất cứ kịch bản hoặc kịch bản nào cũng phải hỗ trợ tùy chọn -h hoặc --help để đưa ra các giúp đỡ cơ bản
  2. Khi được thi hành mà không có bất kỳ tham số nào, kịch bản hoặc thư viện sẽ không thực hiện bất kỳ nhiệm vụ nào, mà chỉ đơn giản là đưa ra yêu cầu, cảnh báo, hoặc giúp đỡ. Và khi đó, giá trị trả về sẽ lớn hơn hoặc bằng 1.

Ví dụ

1 $ ./example.sh
2 :: Parameter is missing. Please try -h or --help for details.
3 $ echo $?
4 1

Thông báo lỗi

  1. Tất cả các thông báo lỗi cần được ghi vào STDOUT
  2. Các thông báo có thể có ích cho việc theo dõi việc thi hành cần được lưu trữ vào STDIN
  3. Các thông báo của chính kịch bản sẽ sử dụng tiền tố để phân biệt với các thông báo của chương trình khác
  4. Không sử dụng trực tiếp lệnh echo để in ra thông báo, mà thông qua trung gian, ví dụ hàm _msg() ở mục Hàm. Thân hàm
  5. Tiền tố của thông báo lỗi có thể sử dụng là :: hoặc bất kỳ tiền tố khác.

Ví dụ

1 $ ./example.sh --help
2 :: Hello, this is help message. Please use one of following options
3 ::   --print    print all messages
4 ::   --debug    print debug information

Tham khảo biến

  1. Đối với hằng và biến toàn cục: luôn sử dụng cấu hình bên ngoài khi có thể
  2. Luôn sử dụng cặp dấu ngoặc khi tham khảo biến bên trong một chuỗi, ví dụ "this is a string with ${special_chars}"
  3. Luông sử dụng $() để lấy kết quả của hàm ngoài, thay vì sử dụng cặp dấu nháy ngược @``$. Ví dụ
1 for file in $(ls -la); do
2   echo $file
3 done

Pipe

  1. Mỗi lệnh pipe đều được viết ở một dòng mới (như vậy, sẽ phải sử dụng ký tự thoát \ ở dòng liền trên)
  2. Dấu pipe đặt liền với lệnh kế tiếp (không có khoảng trắng phía sau ký tự |)

Ví dụ

1 cat $f_example_file \
2   |awk '{print $1}' \
3   |sed -e 's#foobar#example#g'

Kiểm tra yêu cầu

  1. Tất cả các chương trình không có sẵn trong Bash/Bourne cần được kiểm tra trước khi sử dụng
  2. Quá trình kiểm tra các chương trình phụ thuộc này diễn ra đầu tiên, và có thể sử dụng tùy chọn --check để thực hiện
  3. Nếu không tìm thấy một trong các chương trình phụ thuộc, kịch bản sẽ thoát với mã lỗi > 0
1 $ ./example.sh
2 :: Programs found : sed, awk, gawk
3 :: Programs missed: usermod, ifconfig
4 :: The program will exit due to missed programs. Exit(1).
5 $ echo $?
6 1

Mô tả kịch bản

  1. Mô tả kịch bản cần được ở những dòng đầu tiên của kịch bản, sau dòng shebang
  2. Mô tả kịch bản gồm ít nhất các thông tin sau: mục đích, tác giả, ngày tháng (tạo kịch bản), phiên bản, giấy phép

Ví dụ

1 # Purpose : print out the system error
2 # Author  : not me <[email protected]>
3 # Date    : 20010 April 01
4 # Version : 2.2.4
5 # License : GPL version 2
6 # Homepage: http://freebox.vn/

Canh cột

Việc canh cột làm cho kịch bản rõ ràng, dễ đọc vào chỉnh sửa hơn.

  1. Sử dụng hai khoảng trắng để tạo định dạng của mã nguồn (indentation).
  2. Các lệnh có cùng chức năng được khuyến khích bố trí cùng cột
  3. Đối với lệnh pipe thì lệnh ở dòng tiếp sau sẽ nằm hai cột kế sau lệnh đầu tiêu của dãy pipe
  4. Nếu một lệnh quá dài cần bố trí trên nhiều dòng khác nhau, các dòng kế tiếp của nó được thụt đầu dòng so với tên của lệnh
  5. Mỗi tùy chọn của các lệnh được bố trí ở một dòng riêng, trừ khi có thể bố trí tất cả trên cùng một dòng
  6. Trong các cấu trúc lặp hoặc khai báo hàm, những thành phần của cú pháp sẽ đặt ở dòng đầu tiên, không tách rời

Ví dụ

1 cat $f_test \
2   |sed -e "s/abc/def/g# \
3        -e "s/ABC/xxx/g" \
4   |awk 'BEGIN {n=1} {print $2}'
5 

Ví dụ về khai báo hàm xin xem ở phần Hàm. Thân hàm ở trên. Dưới đây là ví dụ về cấu trúc lặp

1 for pkg in $(pkg); do
2   echo $pkg
3 done

Chú thích

Chuyển hướng

Here document