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
따라서 두 번째 예에서는 쉼표 대신 공백으로 분할하도록 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를 사용하고 있으므로 다른 멋진 기능도 사용할 수 있습니다 :-)