我有与此 SO 帖子中描述的完全相同的问题(“带有冒号的 bash 关联数组键字符串给出错误”):https ://stackoverflow.com/q/40406187/10639803
解决方案是使用declare -A
,但一旦我这样做,我的关联数组就不再是全局的。
declare -A
有没有办法让它全球化?
declare -gA
更新:我按照此处所述进行了尝试: https ://stackoverflow.com/a/21151984/10639803但由于某种原因它对我不起作用:一旦退出填充我的关联数组(哈希图)的循环,数组变得不稳定。
这是实际的 bash 代码(循环内的 echo 命令用于验证是否确实提取并分配了值):
declare -gA HOSTS_START_MAP
find "$TEMP" -type f -name "debug.log*" -exec grep -F "STARTING HOST " {} \; |
while IFS= read -r HOST_START_LINE; do
if [[ $HOST_START_LINE =~ (.*)(DEBUG)(.*)(STARTING HOST)([ 0-9]*)(.*)(CALCULATION) ]]
then
HOST_START_TIME=$(echo "${BASH_REMATCH[1]}" | xargs)
HOST_NAME=$(echo "${BASH_REMATCH[6]}" | xargs)
# echo ">$HOST_NAME< ... >$HOST_START_TIME<"
HOSTS_START_MAP[$HOST_NAME]=$HOST_START_TIME
# echo $HOST_NAME --- ${HOSTS_START_MAP[$HOST_NAME]}
fi
done
echo ${#HOSTS_START_MAP[@]}
for MYKEY in "${!HOSTS_START_MAP[@]}"; do echo $MYKEY --- ${HOSTS_START_MAP[@]}; done
您看到的问题与变量的声明无关。这是因为您在子 shell 中设置变量并期望其值在父 shell 中可用。
您可以在此处看到此效果,使用与您的代码相同的结构,但使用更简单的示例:
幸运的是,使用时
bash
有一个快速的解决方案,可以通过以不同的形式重写代码:在实际代码中,用于
while IFS= read -r item
确保item
接收未处理的输入。我已经省略了我希望在示例中清晰的保护。在对此答案的评论中,您要求修改代码版本。我无法测试它,这就是为什么我一开始犹豫把它放在这里,但它应该看起来像这样: