Di động đến tất cả các vỏ POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Làm điều đó ${foobar:+1}
nếu bạn muốn đối xử foobar
theo cùng một cách cho dù nó trống hay không được xác định. Bạn cũng có thể sử dụng ${foobar-}
để có được một chuỗi trống khi foobar
không xác định và giá trị foobar
khác (hoặc đặt bất kỳ giá trị mặc định nào khác sau -
).
Trong ksh, nếu foobar
được khai báo nhưng không được xác định, như trong typeset -a foobar
, sau đó ${foobar+1}
mở rộng thành chuỗi rỗng.
Zsh không có các biến được khai báo nhưng không được đặt: typeset -a foobar
tạo một mảng trống.
Trong bash, mảng hoạt động theo một cách khác và đáng ngạc nhiên. ${a+1}
chỉ mở rộng thành 1
nếu a
là một mảng không trống, vd
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
Nguyên tắc tương tự áp dụng cho các mảng kết hợp: các biến mảng được xử lý như được định nghĩa nếu chúng có một bộ chỉ mục không trống.
Một cách khác để kiểm tra cụ thể về bash xem một biến thuộc bất kỳ loại nào đã được xác định hay chưa là kiểm tra xem nó có được liệt kê trong đó không . Điều này báo cáo các mảng trống như được định nghĩa, không giống như , nhưng báo cáo các biến được khai báo nhưng không được gán ( ) là không xác định.${!PREFIX*}
${foobar+1}
unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Điều này tương đương với việc kiểm tra giá trị trả về của typeset -p foobar
hoặcdeclare -p foobar
, ngoại trừ typeset -p foobar
thất bại đối với các biến được khai báo nhưng không được gán.
Trong bash, như trong ksh, set -o nounset; typeset -a foobar; echo $foobar
gây ra lỗi trong nỗ lực mở rộng biến không xác định foobar
. Không giống như trong ksh, set -o nounset; foobar=(); echo $foobar
(hoặc echo "${foobar[@]}"
) cũng gây ra lỗi.
Lưu ý rằng trong tất cả các tình huống được mô tả ở đây, ${foobar+1}
mở rộng sang chuỗi trống khi và chỉ khi $foobar
sẽ gây ra lỗi bên dưới set -o nounset
.
-v
không phải là một lựa chọntest
, nhưng một toán tử cho các biểu thức điều kiện.