ขึ้นอยู่กับสิ่งที่คุณหมายถึงอยู่
ไม่ตัวแปรที่ได้รับการประกาศ แต่ไม่ได้รับมอบหมายอยู่ ?
ตัวแปรอาเรย์ (หรือแฮช) ที่กำหนดให้มีรายการว่างอยู่หรือไม่
มีตัวแปร nameref ที่ชี้ไปที่ตัวแปรที่ไม่ได้กำหนดไว้ในปัจจุบันหรือไม่?
คุณพิจารณา$-
, $#
, $1
ตัวแปร? (POSIX ไม่ได้)
ในกระสุนคล้ายบอร์นวิธีบัญญัติคือ:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
ใช้งานได้กับตัวแปรสเกลาร์และพารามิเตอร์อื่น ๆ เพื่อบอกว่าตัวแปรได้รับการกำหนดค่า (ว่างเปล่าหรือไม่, โดยอัตโนมัติ, จากสภาพแวดล้อม, การread
กำหนดfor
หรืออื่น ๆ )
สำหรับเปลือกหอยที่มีtypeset
หรือdeclare
คำสั่งที่จะไม่รายงานเป็นตั้งค่าตัวแปรที่ได้รับการประกาศแต่ไม่ได้รับมอบหมายzsh
ยกเว้นใน
สำหรับเชลล์ที่สนับสนุนอาร์เรย์ยกเว้นyash
และzsh
ที่จะไม่รายงานว่าเป็นตัวแปรชุดอาร์เรย์ยกเว้นว่าองค์ประกอบของดัชนี 0 ได้รับการตั้งค่าแล้ว
สำหรับbash
(แต่ไม่ใช่ksh93
หรือzsh
) สำหรับตัวแปรของอาเรย์แบบเชื่อมโยงประเภทที่จะไม่รายงานพวกเขาตามที่ตั้งค่าไว้เว้นแต่ว่าองค์ประกอบของคีย์ "0" ได้รับการตั้งค่าแล้ว
สำหรับksh93
และbash
สำหรับตัวแปรประเภทnamerefว่ามีเพียงผลตอบแทนจริงถ้าตัวแปรอ้างอิงโดย nameref เป็นตัวเองถือว่าเป็นชุด
สำหรับksh
, zsh
และbash
เป็นวิธีการที่ดีกว่าอาจจะเป็น:
if ((${#var[@]})); then
echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi
สำหรับksh93
, zsh
และbash
4.4 หรือสูงกว่านอกจากนี้ยังมี:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
ซึ่งจะรายงานตัวแปรที่ได้รับการตั้งค่าหรือประกาศ
$somevar
ให้เป็นค่า /${somevar:=42}
สตริงถ้าตัวแปรไม่มีอยู่: