Bashの次のforループでエラーが発生します。
line 42: 1
2
3
4
5 + 1: syntax error in expression (error token is "2
3
4
5 + 1")
42行目は次のとおりです。数値1=$[$i1 + 1]
for i1 in `seq 1 5`
do
num1=$[$i1 + 1]
for k1 in `seq $num1 5`
do
ky1="${team_two[i1]}_${team_two[k1]}"
pair_score[$ky1]=$[${pair_score[$ky1]}+1]
done
done
コードに問題がありますか?
編集する
デバッグ中に、次の結果が表示されます。
++ seq 1 5
+ for i1 in '`seq 1 5`'
/home/ashwin/bin/calculate_power: line 43: 1
2
3
4
5 + 1: syntax error in expression (error token is "2
3
4
5 + 1")
43行目には以下の内容も記載されています。数字1=$[$i+1]
答え1
${team_two[*]}
&配列に問題があるか、${team_two[k1]}
特殊変数の区切り文字を混乱させたようです$IFS
。set -x
外部forループに入る前に追加することで、Bashデバッグをオンにすることができます。次に、を使用set +x
して無効にして、追加の洞察を得ます。
set -x
... for loop block ...
set +x
はい
このように Bash でコードを実行すると、次のような結果が表示されます。
$ bash -x for.bash
++ seq 1 5
+ for i1 in '`seq 1 5`'
+ num1=2
++ seq 2 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=1
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=2
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=3
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=4
+ for i1 in '`seq 1 5`'
+ num1=3
++ seq 3 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=6
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=7
+ for i1 in '`seq 1 5`'
+ num1=4
++ seq 4 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=8
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=9
+ for i1 in '`seq 1 5`'
+ num1=5
++ seq 5 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=10
+ for i1 in '`seq 1 5`'
+ num1=6
++ seq 6 5
編集#1
追加のアップデート後にリセットされたようです$IFS
。通常、$IFS
リセットする前に補助変数に保存して後で元の値に復元できます。
IFSOLD=$IFS
IFS=,
... do IFS , stuff here ...
IFS=$IFSOLD
IFS
$IFS
これらの例を試してみると、スクリプトで使用された場合の影響をよりよく理解するのに役立ちます。
次のような変数があるとしましょう。
$ var="1,2,3,4,5"
それでは、それを解析して最初の変数を印刷してみましょう$c1
。
$ IFS=',' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1
$IFS
しかし、空間に変えれば。
$ IFS=' ' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1,2,3,4,5
したがって、2番目の例では、カンマではなくスペースに分割するようにread
viaコマンドを設定します。$IFS
答え2
そのコードには(基本的に)問題はありません。問題は、「IFS」を他の場所でリセットしたことです。空(したがって、出力はseq
単一のトークンとして扱われます。)
長い本誌は$[]
かなりです。役に立たない(そして文書化されていません)。使用$(( ))
。
seq
useを使用しfor (( ))
て1を追加する代わりに、let var++
次の操作を行います。
for (( i1=1 ; i1<=5; i1++))
do
for ((k1=i1+1; k1<=5; k1++))
do
ky1="${team_two[i1]}_${team_two[k1]}"
let pair_score[$ky1]++
done
done
連想配列で最近bashを使用しているので、他の素晴らしい機能も使用できます:-)