พกพาไปยังเปลือก POSIX ทั้งหมด:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
ทำเช่นนั้น${foobar:+1}
หากคุณต้องการที่จะปฏิบัติfoobar
ในลักษณะเดียวกันไม่ว่าจะว่างเปล่าหรือไม่ได้กำหนดไว้ นอกจากนี้คุณยังสามารถใช้${foobar-}
เพื่อรับสตริงว่างเมื่อfoobar
ไม่ได้กำหนดและค่าเป็นfoobar
อย่างอื่น (หรือใส่ค่าเริ่มต้นอื่น ๆ หลังจากนั้น-
)
ใน ksh ถ้าfoobar
ถูกประกาศ แต่ไม่ได้กำหนดเช่นเดียวกับในtypeset -a foobar
แล้ว${foobar+1}
ขยายไปยังสตริงที่ว่างเปล่า
Zsh ไม่มีตัวแปรที่ประกาศ แต่ไม่ได้ตั้งค่า: typeset -a foobar
สร้างอาร์เรย์ว่าง
ในทุบตีอาร์เรย์ทำงานในวิธีที่แตกต่างและน่าแปลกใจ ${a+1}
จะขยายเป็น1
ถ้าa
ไม่ใช่อาร์เรย์ว่างเท่านั้นเช่น
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
หลักการเดียวกันนี้ใช้กับอาเรย์แบบเชื่อมโยง: ตัวแปรอาเรย์จะได้รับการปฏิบัติตามที่กำหนดไว้หากมีดัชนีที่ไม่ว่างเปล่า
วิธีที่แตกต่างและเฉพาะเจาะจงในการทดสอบว่ามีการกำหนดตัวแปรชนิดใดหรือไม่เพื่อตรวจสอบว่ามีการระบุไว้หรือไม่ รายงานนี้อาร์เรย์ว่างเปล่าตามที่กำหนดซึ่งแตกต่างจากแต่รายงานตัวแปรที่ประกาศ แต่ไม่ได้กำหนด ( ) เป็นไม่ได้กำหนด${!PREFIX*}
${foobar+1}
unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
นี่เทียบเท่ากับการทดสอบค่าส่งคืนของtypeset -p foobar
หรือdeclare -p foobar
ยกเว้นว่าtypeset -p foobar
ล้มเหลวกับตัวแปรที่ประกาศ แต่ไม่ได้กำหนด
ในทุบตีเหมือนใน ksh, ก่อให้เกิดข้อผิดพลาดในความพยายามที่จะขยายตัวแปรไม่ได้กำหนดset -o nounset; typeset -a foobar; echo $foobar
foobar
ไม่เหมือนกับใน ksh set -o nounset; foobar=(); echo $foobar
(หรือecho "${foobar[@]}"
) นอกจากนี้ยังก่อให้เกิดข้อผิดพลาด
โปรดทราบว่าในทุกสถานการณ์อธิบายไว้ที่นี่${foobar+1}
จะขยายสตริงที่ว่างเปล่าและถ้าหากจะทำให้เกิดข้อผิดพลาดภายใต้$foobar
set -o nounset
-v
ไม่ใช่ตัวเลือกtest
แต่เป็นโอเปอเรเตอร์สำหรับนิพจน์ที่มีเงื่อนไข