2011-05-12 51 views
3

我有一堆我想檢查的變量,如果它們包含值「None」,那麼我想清空它們。BASH通配符:選擇所有變量(不是內容)

var1=(check for some value, sometimes it returns "none") 
    var2=(check for some value, sometimes it returns "none") 
    var3=(check for some value, sometimes it returns "none") 
    someBizzareName=(check for some value, sometimes it returns "none") 

    if [[ "${var1}" == "None" ]] ; then 
     var1="" 
    fi 
    if [[ "${var2}" == "None" ]] ; then 
     var2="" 
    fi 

這是所有工作的罰款和花花公子,只是因爲我有很多VARN的,我將結束與一噸的if [[ "${varN}" == "None" ]]我必須知道他們的名字;所以我想知道,因爲它是在BASH非常天然的搜索和匹配的一切,如果有變量的通配符,內循環,這將匹配所有瓦爾斯,像${*}(我試過,沒有工作)?我做了各種搜索,但總是找到一些關於匹配變量內容,而不是var本身..?

回答

6

全部,no。但是你可以匹配一個模式(但不是*)。

$ echo "${!B*}" 
BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION 
+0

嘿,這工作:)它看起來像普通[正則表達式(http://www.regular-expressions.info/)語法,所以像' [AZ] [0-9]'應該有效; **和**它是本地的我的for循環;謝謝 ! – yPhil 2011-05-12 10:48:11

+0

這是一個glob,而不是正則表達式。 – 2011-05-12 10:49:41

+0

啊,謝謝你Ignacio。讓我的生活更輕鬆地搜索如何匹配字符串的末尾而不是開頭。 – yPhil 2011-05-12 11:03:47

1

所有,是;-)

大多數Unix/Linux的支持無論是envprintenv,其產生輸出像

var=value 

export命令,不帶任何參數,將列出所有出口變量在你的環境中。

for varAndVal in $(env) ; do 
    case ${varAndVal} in 
    *=none) 
     eval \$${varAndVal}= 
     #OR eval unset \$${varAndVal} 
    ;; 
    esac 
done 

我希望這會有所幫助。

P.S.因爲你似乎是一個新用戶,如果你得到一個可以幫助你的答案,請記住將它標記爲已接受,並且/或者給它一個+(或 - )作爲有用的答案。

+0

這並不完全符合我的要求;它匹配(真的只是列出他們)的環境變量,當我不僅要匹配我的腳本當地的變量(顯然),但如果可能的話,本地我的for循環,只是爲了安全 – yPhil 2011-05-12 10:40:27

+0

是的,對不起,錯過了關於循環。祝你好運! – shellter 2011-05-12 11:15:36

2

您還可以使用內置的compgen:

man bash | less -p 'compgen .option. .word.' 
compgen -A variable B