来自变量的Bash关联数组键

时间:2016-12-03 11:13:21

标签: bash associative-array

在下面的脚本中,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]:错误的数组下标

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

由于

1 个答案:

答案 0 :(得分:0)

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