Bashで変数を配列の長さに設定中にエラーが発生しました。

Bashで変数を配列の長さに設定中にエラーが発生しました。

デフォルトでは、元帳から残高を2つの配列に取り、必要な方法で印刷できる大きなスクリプトに次のコードがあります。

#!/bin/bash
assets=("assets:checking" "assets:google wallet" "assets:savings" "assets:cash")
assets-bal=()

num=${#assets[@]}
for $i in {0..${num}}
do
  read -a tmp <<< `ledger -f finances balance "${assets[${i}]}"`
  assets-bal[${i}]=tmp[0]
  echo "${assets[${i}]}   ${assets-bal[${i}]}"
done

スクリプトを実行しようとするたびにエラーが発生します。

syntax error near unexpected token `num=${#assets[@]}'
`num=${#assets[@]}'

私の検索結果はその行に問題があってはいけません。なぜそれがうまくいかないのかを調べるために空のままにしておきました。

誰もが私が間違っている場所を指摘できますか?

答え1

問題は次のとおりです。

assets-bal=()

変数名にダッシュを含めることはできません。下線のみ使用できます。

bashどのように説明するのかわかりませんが、assets-bal=()コマンドが不完全で他の行で完了する必要があると思います。どういう意味かを見るには、シェルでこの行を実行してみてください。

答え2

中かっこ拡張が完了したため、変数はサポートされていません。変数拡張前seq必須の場合は、次を使用してください。

for i in $(seq 0 ${num})

または(より良い)配列キーを直接取得します。

for i in "${!assets[@]}"

(またそうではfor i in ..ありませんfor $i in ..。)


ハウクラグ最初のエラーが発生しました。この問題を解決すると、次のエラーが発生することがあります。


代わりに

read -a tmp <<< `ledger -f finances balance "${assets[${i}]}"`

以下を使用することを検討してください。

tmp=($(ledger -f finances balance "${assets[${i}]}"))

外部()コマンド置換はそれを配列に変換します。

答え3

構文エラーがあります。-変数名には使用できません。

assets-bal

と交換する必要があります

 assets_bal   

forForループにはCスタイルループを使用できます。

for ((i=0; i<${num}; i++)); do

答え4

私はあなたが配列型と一般的に変数に依存しすぎていると思います。上記の作業を正しく理解している場合は、これも同じことを行う必要があると思います。

for a in checking google\ wallet savings cash
do  a=assets:$a
    printf "$a\t%d\n" "$(ledger -f finances balance "$a")"
done

$asedこれは、上記のすべての値をストリームから一度に読み取り、類似または類似のスクリプトエディタを使用してソートすることによって大幅に改善できます。通常、シェル変数は、重要な値やサイズに関係なく、情報を保持するのに非常に悪い場所です。シェル変数は、ファイル内の実際の情報をより簡単に検索するのに十分な情報のみを保存する必要があります。

シェル関数で書かれた上記のコードは次のとおりです。

assets() if   [ "$#" -gt 0 ]
         then while [ "$#" -gt 0 ]
              do    printf "assets:%s\t%d\n" "$1" "$(
                    ledger -f finances balance "assets:$1")"
              shift;done
         else assets checking google\ wallet savings cash
         fi

...次のように呼び出すことができます。

assets

...基本リストまたは同様のもの...

assets cash checking

...他のリストに対して個々のシェル変数の値を設定する必要はありません。

関連情報