如何匹配包含不区分大小写的段" proxy"那不是前缀?我在bash:
root@PDPINTDEV9:~# echo ${SHELL}
/bin/bash
我想同时取消一堆代理变量。他们都有"代理"或者" PROXY"在名称中,例如http_proxy
或NO_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
在下面解决:事实证明你无法做到。疯了,但谢谢大家。
答案 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*}