2016-12-03 19 views
1

以下のスクリプトでは、parseTaskはグローバル変数topicpointsを特定のファイルから抽出します。タスク名(ファイル名から)とそのトピックを出力します。変数からの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 science

taskName: calculate product
topic: arithmetic

taskName: 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

私が持つ任意のヘルプを使用することができますここで何が起こっているのか把握する。

おかげで(私はあなたのエラーの原因だと思います)

+3

これは役立つかもしれない:http://www.shellcheck.net/と[bashスクリプトをデバッグする方法?](http://unix.stackexchange.com/q/155551/74329) – Cyrus

+2

ワン(私はあなたのエラーの原因だと思います): 'parseTask'を呼び出すと、' IFS'の値をグローバルに変更しました。 'IFS =/read -a fields <<<" $ line "'(* no *セミコロン)を使用してください。関連している:あなたが非常に良い理由がない限り、*常に*パラメータの拡張を引用する。 – chepner

+1

ありがとうございました@chepner、それでした。 –

答えて

0

一つの問題:あなたはparseTaskを呼び出すときにも、グローバルIFSの値を変更しました。 IFS=/ read -a fields <<< "$line"なし、セミコロン)を使用してください。関連:常にあなたが非常に良い理由がない限り、パラメータの拡張を引用します。 –   chepner