使用全局扩展对环境变量进行Bash错误替换

时间:2017-10-27 20:37:57

标签: bash environment-variables glob

如何匹配包含不区分大小写的段" proxy"那不是前缀?我在bash:

root@PDPINTDEV9:~# echo ${SHELL}
/bin/bash

我想同时取消一堆代理变量。他们都有"代理"或者" PROXY"在名称中,例如http_proxyNO_PROXY。我想使用glob扩展,this answer & comment says is what bash uses

同样基于that answer,我发现我可以找到以" PROXY"开头的环境变量:

root@PDPINTDEV9:~# echo "${!PROXY*}"
PROXY_IP PROXY_PORT

doesn't make sense with what I've read关于全球扩张。基于这些,"${!PROXY*}"应匹配任何不以代理开头的内容......我认为。

此外,我无法通过glob语法获得任何有意义的实际工作:

root@PDPINTDEV9:~# echo ${*proxy}
-bash: ${*proxy}: bad substitution
root@PDPINTDEV9:~# echo "${!*[pP][rR][oO][xX][yY]}"
-bash: ${!*[pP][rR][oO][xX][yY]}: bad substitution

在下面解决:事实证明你无法做到。疯了,但谢谢大家。

2 个答案:

答案 0 :(得分:2)

Variable name expansion,作为shell parameter expansion的特例,不支持通配。但它有两种风格:

${!PREFIX*}
${!PREFIX@}

两者中,*@字符都是硬编码的

第一个表单将扩展为前缀为PREFIX的变量名称,并加上IFS的第一个字符(默认为空格):

$ printf "%s\n" "${!BASH*}"
BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND ...

第二种形式将扩展为变量名称(前缀为PREFIX),但作为单独的单词:

$ printf "%s\n" "${!BASH@}"
BASH
BASHOPTS
BASHPID
BASH_ALIASES
BASH_ARGC
...

这两种形式都是区分大小写的,因此要以不区分大小写的方式获取变量名称you can use set,并将其与某些{{ {1}}和cut

grep

答案 1 :(得分:1)

  

但这与我读过的关于全球扩张的内容没有关系。   基于这些,“${!PROXY*}”应匹配任何无法启动的内容   与代理......我想。

不,不。

首先,!字符对于路径名扩展并不重要,除非它出现在模式中字符类的开头,在这种情况下,类的意义被反转。例如,fo[!o]是匹配任何三个字符的字符串的模式,前两个字符是“fo”,第三个字符不是另一个“o”。但是你的表达中没有字符类。

但更重要的是,路径名扩展与您的表达式${!PROXY*}完全无关。那里没有斑点。 '!'和'*'是参数扩展形式之一的语法的固定部分。该特定扩展根据定义生成名称以“PROXY”开头的所有shell变量的名称,由IFS变量的值的第一个字符分隔。如果它出现在双引号之外,它相当于${!PROXY@},它不易受到与全局相关的混淆。

  

此外,我无法通过glob语法获得任何有意义的实际工作:[...]

不,因为再一次,没有发生任何影响。您需要准确${!后跟感兴趣的名称前缀,然后是*}@},以形成您要询问的特定类型的参数扩展。

  

如何匹配包含不区分大小写的段“proxy”的环境变量?

您需要明确表达您感兴趣的案例变体。例如:

${!PROXY*} ${!proxy*} ${!Proxy*}