来自变量的Bash关联数组键

问题描述 投票:1回答:1

在下面的脚本中,parseTask设置从给定文件中提取的全局变量topicpoints。然后打印任务名称(来自文件名)及其主题。

BASE_DIR=/root/devops/tasks

function nextSection {
    if [ "$section" == "topic" ]; then
        section="points"
    else
        section="topic"
    fi
}

function parseTask {
    section=""
    while read line
    do
        if [ "$line" == "---" ]; then
            nextSection
            continue
        elif [ "$section" == "topic" ]; then
            topic=$line
        elif [ "$section" == "points" ] && [ "$line" != "" ]; then
            IFS=/; read -a fields <<<"$line"
            points=$((${fields[1]}-${fields[0]}))
        fi
    done < "$1/README.txt"
}

for task in $BASE_DIR/*
do
    parseTask "$task"
    if [ "$points" -eq 0 ]; then
        continue
    fi
    local taskName=${task:${#BASE_DIR}+1}
    echo "taskName: $taskName"
    echo "topic: $topic"
    echo
done

当我运行它时,我得到以下(预期)输出。

taskName:很棒的产品功能 话题:计算机科学

taskName:计算产品 话题:算术

taskName:sum函数 话题:计算机科学

我想定义从taskName到topic的映射,所以我将其更改为

declare -A taskTopics
for task in $BASE_DIR/*
do
    parseTask "$task"
    if [ "$points" -eq 0 ]; then
        continue
    fi
    local taskName=${task:${#BASE_DIR}+1}
    echo "taskName: $taskName"
    echo "topic: $topic"
    echo
    taskTopics[$taskName]=$topic
done

但现在我收到一个错误:

第13行的file.sh:/README.txt:没有这样的文件或目录 第41行的file.sh:taskTopics [$ taskName]:错误的数组下标

我可以使用任何帮助来弄清楚这里发生了什么。

谢谢

bash associative-array
1个回答
0
投票

一个问题(我认为是导致错误的原因):当您调用IFS时,您还全局更改了parseTask的值。使用IFS=/ read -a fields <<< "$line"(没有分号)。相关:总是引用参数扩展,除非你有充分的理由不这样做。 - chepner

© www.soinside.com 2019 - 2024. All rights reserved.