在下面的脚本中,parseTask设置从给定文件中提取的全局变量topic
和points
。然后打印任务名称(来自文件名)及其主题。
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]:错误的数组下标
我可以使用任何帮助来弄清楚这里发生了什么。
由于
答案 0 :(得分:0)
一个问题(我认为是导致错误的原因):当您致电IFS
时,您还全局更改了parseTask
的值。使用IFS=/ read -a fields <<< "$line"
(否分号)。相关:总是引用参数扩展,除非你有充分的理由不这样做。
- chepner