Câu trả lời:
Một số shell lịch sử đã triển khai một trình phân tích cú pháp rất đơn giản có thể bị nhầm lẫn bởi những thứ như [ -n = "" ]
toán hạng đầu tiên =
trông giống như một toán tử và sẽ phân tích cái này như là [ -n = ]
hoặc gây ra lỗi cú pháp. Trong [ "x$1" = x"" ]
, x
tiền tố đảm bảo rằng x"$1"
không thể trông giống như một toán tử, và vì vậy cách duy nhất mà shell có thể phân tích kiểm tra này là bằng cách xử lý =
như một toán tử nhị phân.
Tất cả các trình bao hiện đại và thậm chí hầu hết các trình bao cũ hơn vẫn còn hoạt động, tuân theo các quy tắc POSIX bắt buộc tất cả các biểu thức kiểm tra có tối đa 4 từ được phân tích cú pháp chính xác. Vì vậy, [ -z "$1" ]
một cách thích hợp để kiểm tra nếu $1
trống và [ "$x" = "$y" ]
là một cách thích hợp để kiểm tra sự bằng nhau của hai biến.
Ngay cả một số shell hiện tại có thể bị nhầm lẫn với các biểu thức dài hơn và một vài biểu thức thực sự mơ hồ, do đó, tránh sử dụng các toán tử -a
và -o
để xây dựng các thử nghiệm boolean dài hơn, và thay vào đó sử dụng các lệnh gọi [
riêng &&
và ||
các toán tử boolean của shell .
[ -z "$1" ]
là một cách kiểm tra thích hợp nếu $1
trống . sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- cả hai trả về 0, nhưng trong trường hợp thứ hai $1
không thể để trống vì nó không tồn tại.
Theo http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quote-guide.html , -z
thử nghiệm không an toàn trong một số triển khai , có lẽ là khi các chuỗi "thú vị" "-o a=a"
được thử nghiệm.
Các bài kiểm tra trên cũng sẽ gây ra lỗi nếu bạn chạy với "set -u" hoặc "set -o nounset"
Một cách ổn định hơn để kiểm tra một biến trống sẽ là sử dụng mở rộng tham số :
MYVAR = $ {MYVAR: - "Giá trị xấu"}
Phương pháp này hoạt động cho vỏ bourne truyền thống, cũng như ksh và bash.
function isBlank {
valueNoSpaces=$(echo "$@" | tr -d ' ')
if [ "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ]
then
echo true ;
else
echo "" ;
fi
}
#Test
if [ $(isBlank " ") ]
then
echo "isBlank \" \" : it's blank"
else
echo " isBlank \" \": it is not blank"
fi
if [ $(isBlank "abc") ]
then
echo "isBlank \"abc\" : it's blank"
else
echo "isBlank \"abc\" :it is not blank"
fi
if [ $(isBlank null) ]
then
echo "isBlank null : it's blank"
else
echo "isBlank null : it is not blank"
fi
if [ $(isBlank "") ]
then
echo "isBlank \"\" : it's blank"
else
echo "isBlank \"\" : it is not blank"
fi
#Result
isBlank " " : it's blank
isBlank "abc" :it is not blank
isBlank null : it's blank
isBlank "" : it's blank
=
so với -z
, bây giờ làm thế nào.
sh
trên một số Unice thương mại vẫn có vấn đề. Xem ở đây để biết chi tiết.