以下のスクリプトでは、parseTaskはグローバル変数topic
とpoints
を特定のファイルから抽出します。タスク名(ファイル名から)とそのトピックを出力します。変数からのBash連想配列キー
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: awesome product function
topic: computer sciencetaskName: calculate product
topic: arithmetictaskName: sum function
topic: computer science
私はトピックにタスク名からのマッピングを定義したいので、私は
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
にそれを変更しかし、今、私はエラーを取得する:
file.sh on line 13: /README.txt: No such file or directory
file.sh on line 41: taskTopics[$taskName]: bad array subscript
私が持つ任意のヘルプを使用することができますここで何が起こっているのか把握する。
おかげで(私はあなたのエラーの原因だと思います)
これは役立つかもしれない:http://www.shellcheck.net/と[bashスクリプトをデバッグする方法?](http://unix.stackexchange.com/q/155551/74329) – Cyrus
ワン(私はあなたのエラーの原因だと思います): 'parseTask'を呼び出すと、' IFS'の値をグローバルに変更しました。 'IFS =/read -a fields <<<" $ line "'(* no *セミコロン)を使用してください。関連している:あなたが非常に良い理由がない限り、*常に*パラメータの拡張を引用する。 – chepner
ありがとうございました@chepner、それでした。 –