デフォルトでは、元帳から残高を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
for
Forループには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
$a
sed
これは、上記のすべての値をストリームから一度に読み取り、類似または類似のスクリプトエディタを使用してソートすることによって大幅に改善できます。通常、シェル変数は、重要な値やサイズに関係なく、情報を保持するのに非常に悪い場所です。シェル変数は、ファイル内の実際の情報をより簡単に検索するのに十分な情報のみを保存する必要があります。
シェル関数で書かれた上記のコードは次のとおりです。
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
...他のリストに対して個々のシェル変数の値を設定する必要はありません。