Bash:循环中关联数组的可变范围

时间:2018-08-13 13:42:18

标签: arrays bash scope

让我们拥有这个降价模板 tpl.md

{{title}} {{date}}
==========
{{author}},
*{{titleFull}}*,
{{date}}
{{book}}, {{ref}}

*{{summary}}*

和脚本(其目的是询问未设置参数的值,因此将 yad 用作 gui

#! /bin/bash
TPL="tpl.md"

# Create a template environment variable
declare -gA tev;
tev=([author]="FrViPofm" [date]=$(date +%Y%m%dT%H%M%S))

# check keys
echo "start keys: ${!tev[@]}"

# Search the placeholders
sed -e 's/}}/}}\n/g' "$TPL" | grep -0o "{{.*}}" | while read key ;do
    key="${key##*\{}" # remove left
    key="${key%%\}*}" # remove right
    if [[ "$key" != *[[:alnum:]]* ]]; then
        continue
    fi

    if [ -z ${tev[$key]+x} ]; then # check if set
        # Ask to fill the parameter
        res=$(yad --form \
            --height "400" --width "700" --center \
            --title "Paramètre ‘$key’..." \
            --text "Veuillez renseigner le paramètre suivant" \
            --field "${key^}" "_${key}_" \
            --button="gtk-cancel:1" --button="gtk-ok:0" \
            ) || exit 1
        res="${res// /♲}"

        read \
          val \
          <<< "${res//\|/ }"
        tev[$key]="${val//♲/ }"
        export tev[$key]
        echo "loop keys: ${!tev[@]}"

    else
        echo "'$key' is set to '${tev[$key]}'"
    fi
done

echo "end keys: ${!tev[@]}"

在我的bash版本(4.3.48)上,脚本将按预期返回,两个键先初始化

start keys: date author

找到第一个占位符 title 时,脚本将按预期方式返回树键

....
loop keys: date author title

稍后,它将根据看到的占位符(但顺序似乎已更改)使用新的键递增结果,例如:

...
loop keys: titleFull book ref date author title
...

但是在循环之后,最后,添加的键消失了,仅保留了前两个键:

end keys: date author

使用关联数组是否有限制?是一种声明关联数组以保留其键的方法吗?

感谢您的明智...

0 个答案:

没有答案