在脚本中取消设置以前导字符串开头的所有环境变量(不关闭或重新启动bash)

时间:2017-03-30 15:29:59

标签: bash shell

我想:

  

取消设置myvarname *

其中myvarname是一个字符串而*是......好吧,你得到了它。

尝试

  

env | grep string |未固化

但不起作用。

我进入了一个脚本,我不想启动一个新的shell,所以没有env -i或者源代码或者重新进入shell

请帮助一个可怜的菜鸟

提前致谢

3 个答案:

答案 0 :(得分:8)

在Bash shell中,${!prefix@}参数扩展会生成所有以prefix开头的变量。

  

${!prefix@}                 扩展为名称以前缀开头的变量的名称                 [...]当使用@且扩展出现在双倍内时                 用引号引起来,每个变量名都会扩展为一个单独的单词。

此列表然后可以传递给unset

unset "${!myvarname@}"

答案 1 :(得分:5)

如果是bash shell,请执行:

unset $(compgen -v myvarname)

例如,显示当前环境中以字母“ S ”开头的所有变量:

unset $(compgen -v  S)

输出:

SAL_USE_VCLPLUGIN
SCREEN_NO
SECONDS
SESSION
SESSIONTYPE
SHELL
SHELLOPTS
SHLVL
SSH_AUTH_SOCK

如果它是 POSIX shell,请尝试更通用的内容:

unset $(env | sed -n 's/^\(S.*\)=.*/\1/p')

或者如果 GNU grep可用:

unset $(env | grep -o '^S[^=]*')

答案 2 :(得分:4)

试试这个 -

unset $(env | grep string |awk -F'=' '{print $1}')

假设我有像 -

这样的环境变量
printenv
string1=hello
string2=vipin

当您使用字符串grep进行搜索时,将获取这两个环境并获取环境变量的名称并传递给unset命令。