为什么bash无法从compgen中找到我的变量进入循环?

时间:2016-02-15 16:51:12

标签: bash shell

我正在尝试将一些变量推送到bash数组中。由于某些原因我无法理解,我的脚本直接找到变量templates_age但不在循环中。

您可以尝试BASH Shell Online上的代码。

脚本:

templates_age="42"
templates_name="foo"
echo "age=${templates_age}"
echo "name=${templates_name}"

readarray GREPPED < <($(compgen -A variable | grep "templates_"))
for item in "${GREPPED[@]}"
do
    echo "${item}"
done

输出:

age=42
name=foo
./main.sh: line 32: templates_age: command not found

我尝试了不同类型的echo "${item}"但没有成功。

要从grep转换为数组,我正在使用此logic

2 个答案:

答案 0 :(得分:1)

要从命令的输出中正确填充数组,请使用进程替换,而不使用名为命令替换的$(...)

readarray -t grepped < <(compgen -A variable | grep "templates_")

另请注意使用-t修剪换行符。

完整脚本:

templates_age="42"
templates_name="foo"
echo "age=${templates_age}"
echo "name=${templates_name}"

readarray -t grepped < <(compgen -A variable | grep "templates_")
declare -p grepped

for item in "${grepped[@]}"
do
    printf "%s=%s\n" "${item}" "${!item}"
done

答案 1 :(得分:1)

我不确定您为何要在此使用compgengrep。这不够吗?

for item in "${!templates_@}"; do
    printf '%s=%s\n' "$item" "${!item}"
done

如果你真的想填充一个数组,它就像:

一样简单
grepped=( "${!templates_@}" )

请参阅参考手册中的Shell Parameter Expansion