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 行是语句 -num1=$[$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 行同样是这样的陈述 -num1=$[$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

因此,在第二个示例中,我们将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    

由于您正在使用最近的带有关联数组的 ba​​sh,因此也可以使用其他不错的功能:-)

相关内容