2011-03-23 70 views
9

使用bash,檢查變量是否爲空的最佳方法是什麼?bash中未設置和空變量之間的區別

如果我使用:

if [ -z "$VAR" ] 

的建議在論壇上適用於未設置變量,但是當變量被設置爲空,但它是真實的。 建議?

回答

1
if [ `set | grep '^VAR=$'` ] 

此搜索字符串「VAR =」:你可以用它來測試這兩種情況下。

+0

我不知道是誰投票給你,但你的解決方案對我有用! – green69 2011-03-23 14:52:06

+0

我第一次回答了錯誤的問題。這是一個更正的答案。 – 2011-03-23 14:56:06

+1

我的失望是因爲這是單一性,笨拙和低效的。外殼具有內置的功能;另外,你有一個[無用的反引號](http://www.iki.fi/era/unix/award.html#backticks),顯然[對'if語句做了什麼不完全的理解。]( http://stackoverflow.com/questions/36371221/bash-if-statement-too-many-arguments/36371520#36371520) – tripleee 2016-04-06 07:14:29

28

${var+set}如果變量未設置,則不進行替換,如果設置爲包括空字符串在內的任何值,則將其替換爲set${var:+set}僅當變量設置爲非空字符串時纔會替換set。在設置的變量列表

if [ "${foo+set}" = set ]; then 
    # set, but may be empty 
fi 

if [ "${foo:+set}" = set ]; then 
    # set and nonempty 
fi 

if [ "${foo-unset}" = unset ]; then 
    # foo not set or foo contains the actual string 'unset' 
    # to avoid a potential false condition in the latter case, 
    # use [ "${foo+set}" != set ] instead 
fi 

if [ "${foo:-unset}" = unset ]; then 
    # foo not set or foo empty or foo contains the actual string 'unset' 
fi 
+3

只是圓了這個答案你想補充一點'-'工作方式恰好相反,即'$ {foo-如果foo未設置,則'unset}'產生'未設置'。這對幹運行腳本是有用的,例如, 'rsync -avuz $ {DRYRUN =幹運行} $ HOME/blog/webserver:blog /'必須以'DRYRUN = upblog.sh'運行才能真正執行上傳。 – 2014-03-19 17:13:27

+1

這應該是被接受的答案。編輯答案包括@ jcomeau_ictx的出色評論。 – dev 2015-10-15 09:17:54

0

好,這裏有一個方法,如果變量沒有設置將發生

$ s="" 
$ declare -p s 
declare -- s="" 
$ unset s 
$ declare -p s 
bash: declare: s: not found 

錯誤消息。

+0

最初的問題是如何區分設置爲空字符串的變量與根本沒有設置的變量。這兩種情況都返回空白。 – 2011-03-23 15:22:32

+0

是的,我誤解了這個問題。看我的編輯。 – kurumi 2011-03-23 15:27:00

0

您可以

[ -v name ]

名測試時無需$跡象

+0

我無法在Bash v3.2.57(1)或v4.1.5(1)中找到它。這是什麼外殼? – tripleee 2016-04-06 07:17:37

+0

我的bash shell版本在ubuntu 15.10中是4.3。 用「help test」命令檢查是否存在「-v」運算符。 實際上有兩個測試命令 一個是shell內建的,另一個是/ usr/bin/test – mug896 2016-04-10 16:17:44

相關問題