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
由于您正在使用最近的带有关联数组的 bash,因此也可以使用其他不错的功能:-)