Tôi nghĩ câu trả lời bạn là sau khi được ngụ ý (nếu không nói) bởi Vinko 's câu trả lời , mặc dù nó không được nêu ra đơn giản. Để phân biệt xem VAR được đặt nhưng trống hay không được đặt, bạn có thể sử dụng:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Bạn có thể kết hợp hai bài kiểm tra trên dòng thứ hai thành một với:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Tuy nhiên, nếu bạn đọc tài liệu về Autoconf, bạn sẽ thấy rằng họ không khuyên bạn nên kết hợp các thuật ngữ với ' -a
' và khuyên bạn nên sử dụng các thử nghiệm đơn giản riêng biệt kết hợp với &&
. Tôi đã không gặp phải một hệ thống có vấn đề; điều đó không có nghĩa là chúng không tồn tại (nhưng có lẽ chúng cực kỳ hiếm ngày nay, ngay cả khi chúng không hiếm trong quá khứ xa xôi).
Bạn có thể tìm thấy các chi tiết của chúng và các mở rộng tham số shell liên quan khác , lệnh test
hoặc các [
biểu thức điều kiện trong hướng dẫn Bash.
Gần đây tôi đã được hỏi qua email về câu trả lời này với câu hỏi:
Bạn sử dụng hai bài kiểm tra, và tôi hiểu rõ cái thứ hai, nhưng không phải cái thứ nhất. Chính xác hơn là tôi không hiểu sự cần thiết phải mở rộng biến
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
Điều này sẽ không hoàn thành như vậy?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Câu hỏi công bằng - câu trả lời là 'Không, sự thay thế đơn giản hơn của bạn không làm điều tương tự'.
Giả sử tôi viết điều này trước bài kiểm tra của bạn:
VAR=
Thử nghiệm của bạn sẽ cho biết "VAR hoàn toàn không được đặt", nhưng tôi sẽ nói (theo hàm ý vì nó không có gì) "VAR được đặt nhưng giá trị của nó có thể trống". Hãy thử kịch bản này:
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
Đầu ra là:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
Trong cặp thử nghiệm thứ hai, biến được đặt, nhưng nó được đặt thành giá trị trống. Đây là sự khác biệt mà các ký hiệu ${VAR=value}
và ${VAR:=value}
ký hiệu tạo ra. Ditto cho ${VAR-value}
và ${VAR:-value}
, ${VAR+value}
và ${VAR:+value}
, và như vậy.
Như Gili chỉ ra trong câu trả lời của anh ta , nếu bạn chạy bash
với set -o nounset
tùy chọn, thì câu trả lời cơ bản ở trên không thành công unbound variable
. Nó dễ dàng được khắc phục:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Hoặc bạn có thể hủy set -o nounset
tùy chọn với set +u
( set -u
tương đương với set -o nounset
).