我正在寻找一种方法来回显以 nlu_setting 开头的所有环境变量的名称和值,因此输出可能如下所示:
nlu_setting_json=true
nlu_setting_global=0
nlu_setting_bar=foo
有谁知道如何做到这一点?
答案1
for var in "${!nlu_setting_@}"; do
printf '%s=%s\n' "$var" "${!var}"
done
该扩展${!nlu_setting_@}
是bash
特定的扩展,它返回与特定前缀匹配的变量名称列表。这里我们用它来询问所有以字符串开头的名称nlu_setting_
。我们循环这些名称并输出名称以及该变量的值。
我们使用变量间接寻址 ( ) 来获取变量的值${!var}
。
答案2
看了这个问题的答案后,我得出了这样的结论:
compgen -A variable nlu_setting_ | while read v; do
echo "$v = ${!v}";
done
似乎有效。从未听说过 compgen 命令,但如果它是内置的通用 bash,那么应该一切都很好。
答案3
两个旧答案都很好,但我有自己的答案:
env | grep ^nlu_setting_ | while read kv; do echo "$kv"; done
不区分键和值,并使用 grep,但这正是我想要的 - 只有环境变量,仅以正确的前缀开头。也许有人会发现这个变体很有用。
答案4
对于那些想要在 中执行相同操作的人zsh
,可以使用-m
选项typeset
来列出与模式匹配的变量:
$ typeset -m 'nlu_setting_*'
nlu_setting_1=scalar
nlu_setting_2=( some array )
nlu_setting_3=( [associative]=array [now]=some )
要包含类型信息:
$ typeset -pm 'nlu_setting_*'
typeset nlu_setting_1=scalar
typeset -a nlu_setting_2=( some array )
typeset -A nlu_setting_3=( [associative]=array [now]=some )
列出名称与模式匹配的参数:
$ print -rC1 ${(kM)parameters:#nlu_setting_*}
nlu_setting_1
nlu_setting_2
nlu_setting_3
这价值观特殊关联数组的类型$parameters
是变量的类型。例如,仅列出标量:
$ print -rC1 ${(kM)parameters[(R)scalar]:#nlu_setting_*}
nlu_setting_1
(使用R
反向下标)。
要打印相应的名称和值,除了使用 之外typeset -m
,您还可以执行以下操作:
$ for v (${(kM)parameters[(R)scalar]:#nlu_setting_*}) printf '%s=%q\n' $v ${(P)v}
nlu_setting_1=scalar