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

Kab*_*abu 4 bash shell

我想:

取消myvarname*

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

试着

环境| grep string | 未设置

但不起作用.

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

请帮助一个可怜的菜鸟

提前致谢

Ing*_*kat 11

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

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

然后可以将此列表传递给unset:

unset "${!myvarname@}"
Run Code Online (Sandbox Code Playgroud)


VIP*_*MAR 6

尝试这个 -

unset $(env | grep string |awk -F'=' '{print $1}')
Run Code Online (Sandbox Code Playgroud)

假设我有环境变量,例如 -

printenv
string1=hello
string2=vipin
Run Code Online (Sandbox Code Playgroud)

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


agc*_*agc 5

如果是bashshell,请执行以下操作:

unset $(compgen -v myvarname)
Run Code Online (Sandbox Code Playgroud)

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

unset $(compgen -v  S)
Run Code Online (Sandbox Code Playgroud)

输出:

SAL_USE_VCLPLUGIN
SCREEN_NO
SECONDS
SESSION
SESSIONTYPE
SHELL
SHELLOPTS
SHLVL
SSH_AUTH_SOCK
Run Code Online (Sandbox Code Playgroud)

如果它是POSIX shell,请尝试更通用的东西:

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

或者如果GNU grep可用:

unset $(env | grep -o '^S[^=]*')
Run Code Online (Sandbox Code Playgroud)

  • `-v` 适用于所有 shell 变量(导出的和本地的)。`-e` 用于导出/环境变量,因此这可能是 OP 想要的,因为他们使用的是 `env`。请参阅https://unix.stackexchange.com/questions/151118/understand-compgen-builtin-command/151120#151120 (2认同)