Bạn đang mắc phải sai lầm phổ biến khi giả định rằng [
là một phần của cú pháp của lệnh if
. Không phải vậy; cú pháp của if
chỉ đơn giản là
if command; then
... things which should happen if command's result code was 0
else
... things which should happen otherwise
fi
Một trong những command
s chung chúng tôi sử dụng là [
mà là một bí danh cho lệnh test
. Đó là một lệnh đơn giản để so sánh chuỗi, số và tệp. Nó chấp nhận một sự kết hợp khá hẹp của các đối số, và có xu hướng tạo ra các thông báo lỗi khó hiểu và gây nhầm lẫn nếu bạn không vượt qua nó các đối số dự kiến. (Hay đúng hơn, các thông báo lỗi là đầy đủ và hữu ích khi bạn quen với nó, nhưng chúng có thể dễ dàng bị hiểu lầm nếu bạn không được sử dụng.)
Trong chức năng main
, cuộc gọi đến [
xuất hiện sai chỗ. Bạn có thể có nghĩa là
if function "$arg"; then
...
elif ... ; then ...
Nhân tiện, bạn nên luôn trích dẫn các chuỗi của mình. Sử dụng "$1"
không $1
và "$arg"
thay vì $arg
.
Lý do lịch sử cho test
như một bồn rửa chung mà các tác giả không muốn thực hiện một phần cú pháp của if
là một trong những thiết kế kém hấp dẫn của vỏ Bourne gốc. Bash và zsh
các lựa chọn thay thế ít khó sử dụng hơn (như [[
dấu ngoặc kép trong bash, mà bạn sử dụng trong định nghĩa function1
), và tất nhiên, POSIX test
là rất tốt hơn so với sáng tạo ban đầu từ Bell Labs.
Là một làm rõ thêm, chức năng của bạn có thể được đơn giản hóa để chỉ
function1() {
! [[ "$1" =~ "^ ...some regexp... $" ]]
}
Đó là, thực hiện các thử nghiệm với [[
và đảo ngược mã kết quả của nó. (Trường hợp "bình thường" sẽ trả về 0 để thành công, nhưng có thể bạn đang cố gắng xác minh rằng chuỗi không khớp?)
Lưu ý rằng, ít nhất trong phiên bản bash 4, bạn không nên trích dẫn cụm từ thông dụng : làm như vậy buộc kết hợp chuỗi đơn giản - [được ghi lại ở đây] (http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57). Ngoài ra, bạn nên sử dụng 'for arg in" $ @ "' với dấu ngoặc kép hoặc đơn giản hơn 'cho arg; do ... ' –
Bạn nên đặt regex của mình vào một biến. 'pattern = '^ ... một số regexp ... $'; nếu [[$ 1 = ~ $ mẫu]] '. Lưu ý rằng bên trong dấu ngoặc vuông đôi, không cần trích dẫn biến và như glenn đã nói, regex (biến) không bao giờ được trích dẫn. –