BashスクリプトのForループ

BashスクリプトのForループ

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]}特殊変数の区切り文字を混乱させたようです$IFSset -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番目の例では、カンマではなくスペースに分割するようにreadviaコマンドを設定します。$IFS

おすすめ記事