2011-05-12 39 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