!! - 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à 0 và false 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, failtrue || echo "Will not be printed"#true && echo "Things went well"# Things went wellfalse && echo "Will not be printed"#true ; echo "This will always run"# This will always runfalse ; echo "This will always run"# This will always run
Có thể thấy, toán tử || và && 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/bashecho "Starting program at $(date)" # Date will be substitutedecho "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" fidone
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 foo và bar:
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, foo10 và bar thì câu lệnh rm foo? sẽ xóa foo1 và foo2. 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 toconvert image.png image.jpgcp /path/to/project/{foo,bar,baz}.sh /newpath# Will expand tocp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath# Globbing techniques can also be combinedmv *{.py,.sh} folder# Will move all *.py and *.sh filesmkdir foo bar# This creates files foo/a, foo/b, ... foo/h, bar/a, bar/b, ... bar/htouch {foo,bar}/{a..h}touch foo/x bar/y# Show differences between files in foo and bardiff <(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/pythonimport sysfor arg in reversed(sys.argv[1:]): print(arg)