ฉันคิดว่าคำตอบที่คุณตามมานั้นเป็นนัย (ถ้าไม่ได้ระบุไว้) โดยคำตอบของVinkoถึงแม้ว่ามันจะไม่ได้ถูกสะกดออกมาอย่างง่ายๆ ในการแยกแยะว่า VAR นั้นถูกตั้งค่าไว้ แต่ว่างเปล่าหรือไม่ได้ตั้งไว้คุณสามารถใช้:
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
คุณอาจรวมการทดสอบสองรายการในบรรทัดที่สองเข้าด้วยกันกับ:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
แต่ถ้าคุณอ่านเอกสารสำหรับ Autoconf คุณจะพบว่าพวกเขาไม่แนะนำให้รวมข้อตกลงกับ ' -a
' &&
และไม่แนะนำให้ใช้การทดสอบอย่างง่ายแยกต่างหากรวมกับ ฉันไม่พบระบบที่มีปัญหา นั่นไม่ได้หมายความว่าพวกเขาไม่เคยมีอยู่ (แต่พวกเขาอาจจะหายากมากในวันนี้แม้ว่าพวกเขาจะไม่ได้หายากในอดีตอันไกลโพ้น)
คุณสามารถค้นหารายละเอียดของการเหล่านี้และอื่น ๆ ที่เกี่ยวข้องขยายพารามิเตอร์เปลือกที่test
หรือ[
คำสั่งและการแสดงออกตามเงื่อนไขในคู่มือการทุบตี
ฉันเพิ่งถูกถามทางอีเมลเกี่ยวกับคำตอบนี้ด้วยคำถาม:
คุณใช้การทดสอบสองครั้งและฉันเข้าใจการทดสอบครั้งที่สองเป็นอย่างดี แต่ไม่ใช่การทดสอบแรก แม่นยำมากขึ้นฉันไม่เข้าใจความจำเป็นในการขยายตัวของตัวแปร
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
สิ่งนี้จะไม่ประสบความสำเร็จหรือไม่
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
คำถามที่เป็นธรรม - คำตอบคือ 'ไม่ทางเลือกที่ง่ายกว่าของคุณไม่ทำแบบเดียวกัน'
สมมติว่าฉันเขียนสิ่งนี้ก่อนการทดสอบของคุณ:
VAR=
การทดสอบของคุณจะบอกว่า "VAR ไม่ได้ตั้งค่าเลย" แต่ฉันจะพูด (โดยนัยเพราะไม่มีอะไรเกิดขึ้น) "VAR ถูกตั้งค่าไว้ แต่ค่าของมันอาจว่างเปล่า" ลองใช้สคริปต์นี้:
(
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
)
ผลลัพธ์คือ:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
ในการทดสอบคู่ที่สองตัวแปรถูกตั้งค่า แต่ถูกตั้งค่าเป็นค่าว่าง นี่คือความแตกต่างที่${VAR=value}
และ${VAR:=value}
สัญลักษณ์ทำ เหมือนกันสำหรับ${VAR-value}
และ${VAR:-value}
และ${VAR+value}
และ${VAR:+value}
และอื่น ๆ
ในฐานะที่เป็นGiliชี้ให้เห็นในของเขาคำตอบถ้าคุณทำงานbash
กับตัวเลือกแล้วคำตอบที่พื้นฐานข้างต้นล้มเหลวด้วยset -o nounset
unbound variable
แก้ไขได้ง่าย:
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
หรือคุณสามารถยกเลิกset -o nounset
ตัวเลือกด้วยset +u
( set -u
เทียบเท่าset -o nounset
)