Bash
如何檢查“if”語句中是否存在變數?
我需要在
if
語句中檢查變數的存在。大意是:if [ -v $somevar ] then echo "Variable somevar exists!" else echo "Variable somevar does not exist!"
最接近的問題是this,它實際上並沒有回答我的問題。
在現代 bash(4.2 及更高版本)中:
[[ -v name_of_var ]]
來自
help test
:-v VAR,如果設置了 shell 變數 VAR,則為真
取決於你的意思存在。
是否存在已聲明但未賦值的變數?
是否存在已分配空列表的數組(或雜湊)變數?
是否存在指向目前未分配的變數的 nameref 變數?
你考慮
$-
,$#
,$1
變數嗎?(POSIX 沒有)。在 Bourne-like shell 中,規範的方式是:
if [ -n "${var+set}" ]; then echo '$var was set' fi
這適用於標量變數和其他參數,以判斷變數是否已被賦值(自動地,來自環境、分配
read
、for
或其他)。對於具有
typeset
ordeclare
命令的 shell,它不會將已聲明但未分配的變數報告為**set(請注意,在 中,聲明變數會分配一個值,如果未指定,則為預設值)。zsh
對於支持數組的 shell,除非設置了索引 0 的元素,否則
yash
不會zsh
報告為設置數組變數。對於
bash
(但不是ksh93
) ,對於關聯數組zsh
類型的變數,除非它們的鍵“0”元素已設置,否則不會將它們報告為已設置。對於
ksh93
andbash
,對於 nameref 類型的變數*,只有當 nameref 引用的變數本身被認為是**set*時才返回 true 。對於和
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
這將報告已設置或聲明的變數。