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]}특수 변수의 구분 문자를 엉망으로 만든 것 같습니다 $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

따라서 두 번째 예에서는 쉼표 대신 공백으로 분할하도록 readvia 명령을 구성합니다.$IFS

답변2

해당 코드에는 (기본적으로) 아무런 문제가 없습니다. 문제는 "IFS"를 다른 곳에서 재설정했다는 것입니다.비어 있는(따라서 출력은 seq단일 토큰으로 처리됩니다.)

본지 $[]꽤 됐는데쓸모없는(그리고 문서화되지 않음). 사용 $(( )).

sequse를 사용 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를 사용하고 있으므로 다른 멋진 기능도 사용할 수 있습니다 :-)

관련 정보