Điều rõ ràng đầu tiên là bạn nên cung cấp khoảng trắng giữa các đối số của [
, test
hoặc [[
:
if [ "$1" = 1 ];
Khi ở Bash, việc sử dụng [[ ]]
được khuyến nghị vì nó không làm những việc không cần thiết cho biểu thức có điều kiện như tách từ và mở rộng tên đường dẫn. Trích dẫn xung quanh dấu ngoặc kép cũng không cần thiết. Một toán tử dễ đọc hơn ==
cũng có thể được sử dụng.
if [[ $1 == 1 ]];
Thêm lưu ý: Nếu toán hạng thứ hai cũng chứa biến, trích dẫn là cần thiết vì nó có thể bị phù hợp mô hình nếu nó chứa các ký tự dễ nhận biết như *
, ?
, []
, vv .. Nếu mở rộng globbing hoặc phù hợp với mô hình được kích hoạt với shopt -s extglob
, các hình thức khác thích @()
, !()
vv cũng sẽ được công nhận là mẫu. Xem Khớp mẫu .
Với các toán tử thích <
và >
nó vẫn có thể cần thiết vì tôi đã từng gặp một lỗi trong đó không trích dẫn đối số thứ hai gây ra kết quả khác nhau.
Đối với toán hạng đầu tiên, không có gì áp dụng.
Cũng xem xét biến thể đơn giản hơn này:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
Hoặc cô đặc:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"
là một hình thức mở rộng chuỗi con hoặc mở rộng thành viên mảng trong đó 2
là phần bù. Điều này làm cho việc mở rộng bắt đầu ở giá trị thứ hai. Với điều này, chúng tôi có thể không cần sử dụng shift
.
Việc thêm vào --
ngăn không cho mv
nhận ra tên tệp bắt đầu bằng dấu gạch ngang ( -
) là tùy chọn không hợp lệ.
$var
,$(cmd)
, và thậm chí`cmd`
[mà$(cmd)
nên được ưa thích]). Có một số trường hợp cạnh mà bạn không phải trích dẫn, nhưng luôn luôn làm điều đó sẽ không gây tổn thương.