Bash

如何檢查“if”語句中是否存在變數?

  • November 12, 2020

我需要在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

這適用於標量變數和其他參數,以判斷變數是否已被賦值(自動地,來自環境、分配readfor或其他)。

對於具有typesetordeclare命令的 shell,它不會將已聲明但未分配的變數報告為**set(請注意,在 中,聲明變數會分配一個值,如果未指定,則為預設值)。zsh

對於支持數組的 shell,除非設置了索引 0 的元素,否則yash不會zsh報告為設置數組變數。

對於bash(但不是ksh93) ,對於關聯數組zsh類型的變數,除非它們的鍵“0”元素已設置,否則不會將它們報告為已設置。

對於ksh93and bash,對於 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,zshbash4.4 或更高版本,還有:

if typeset -p var 2> /dev/null | grep -q '^'; then
 echo '$var exists'
fi

這將報告已設置或聲明的變數。

引用自:https://unix.stackexchange.com/questions/212183