Variables

Gán giá trị cho một biến:

foo=bar

Và truy cập giá trị thông qua $foo.

Lưu ý rằng foo = bar sẽ được xem như là gọi chương trình foo với hai đối số là =bar.

Dấu '" dùng để chứa giá trị chuỗi. Ngoài ra, " còn hỗ trợ string interpolation:

echo "$foo"
# bar

Tương tự với những ngôn ngữ lập trình, bash hỗ trợ các kỹ thuật điều khiển luồng thực thi bao gồm ifcasewhilefor cũng như là các hàm.

Ví dụ bên dưới là một hàm cho phép tạo ra một thư mục và di chuyển đến thư mục đó:

mcd () {
    mkdir -p "$1"
    cd "$1"
}

Với $1 là đối số đầu tiên của script/hàm.

Sau khi tạo hàm thì gọi thực thi như sau:

mcd folder

Với folder là tên thư mục cần tạo.

Special Variables

Bash sử dụng một danh sách các biến đặc biệt để truy cập đến đối số, error codes, etc (tương tự assembly):

  • $0 - tên script
  • $1 đến $9 - đối số của script
  • $@ - tất cả các đối số
  • $# - số lượng đối số
  • $? - return code (hay exit code) của câu lệnh trước
  • $$ - PID (xem thêm PCB) của script hiện tại
  • !! - toàn bộ câu lệnh vừa nhập (bao gồm cả các đối số). Khi ta thực hiện một câu lệnh mà quên dùng sudo, ta có thể tái thực thi với sudo !!
  • $_ - đối số cuối cùng của câu lệnh vừa nhập

Exit code nếu mang giá trị 0 thì là OK, khác 0 thì là có lỗi. Exit code có thể dùng để thực thi các câu lệnh sử dụng và || (or operator) và && (and operator).

Chương trình true luôn có exit code là 0false luôn có return code là 1. Dấu ; dùng để phân cách các câu lệnh.

false || echo "Oops, fail"
# Oops, fail
 
true || echo "Will not be printed"
#
 
true && echo "Things went well"
# Things went well
 
false && echo "Will not be printed"
#
 
true ; echo "This will always run"
# This will always run
 
false ; echo "This will always run"
# This will always run

Có thể thấy, toán tử ||&& có cách hoạt động tương tự như trong ngôn ngữ JavaScript.

Substitution

Khi sử dụng $(CMD), câu lệnh CMD sẽ được thực thi và kết quả trả về sẽ được sử dụng như là một biến. Tính năng này được gọi là command substitution.

Minh họa:

Ví dụ bằng chương trình tìm chuỗi foobar ở trong các file:

#!/bin/bash
 
echo "Starting program at $(date)" # Date will be substituted
 
echo "Running program $0 with $# arguments with pid $$"
 
for file in "$@"; do
    if ! grep -q foobar "$file"; then
        echo "File $file does not have any foobar, adding one"
        echo "# foobar" >> "$file"
    fi
done

Ngoài ra còn có tính năng process substitution với cú pháp là <( CMD ). Khi sử dụng, câu lệnh CMD sẽ được thực thi và output của nó sẽ được lưu vào một file tạm. File tạm này có thể được dùng để làm đối số của một chương trình nào đó.

Ví dụ, câu lệnh sau sẽ giúp tìm sự khác biệt giữa các files ở trong thư mục foobar:

diff <(ls foo) <(ls bar)

Shell Globbing

  • Wildcards - dùng ? hoặc * để match một hoặc nhiều ký tự. Ví dụ với các files là foo, foo1, foo2, foo10bar thì câu lệnh rm foo? sẽ xóa foo1foo2. Trong khi đó câu lệnh foo* sẽ xóa tất cả trừ bar.
  • Dùng dấu {} để liệt kê các substring có thể có trong chuỗi.

Ví dụ:

convert image.{png,jpg}
# Will expand to
convert image.png image.jpg
 
cp /path/to/project/{foo,bar,baz}.sh /newpath
# Will expand to
cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath
 
# Globbing techniques can also be combined
mv *{.py,.sh} folder
# Will move all *.py and *.sh files
 
mkdir foo bar
# This creates files foo/a, foo/b, ... foo/h, bar/a, bar/b, ... bar/h
touch {foo,bar}/{a..h}
touch foo/x bar/y
# Show differences between files in foo and bar
diff <(ls foo) <(ls bar)
# Outputs
# < x
# ---
# > y

Note

Cần chú ý rằng script không cần phải được viết ở trong bash để được gọi thực hiện ở trong terminal. Ví dụ, đây là một chương trình Python đơn giản giúp in ra tất cả các đối số theo thứ tự nghịch đảo:

#!/usr/local/bin/python
import sys
for arg in reversed(sys.argv[1:]):
    print(arg)

Shell Tools