2011-04-11 3 views
16

for 루프를 구현하는 데 문제가 있습니다. 스크립트를 실행할 때이 오류가 발생합니다.리눅스 셸 스크립트에서 for 루프 구문

test1.sh: 2: Syntax error: Bad for loop variable

이 오류를 이해할 수 없습니다.

#!/bin/bash 
for ((c=1; c<=5; c++)) 
do 
echo "Welcome $c times..." 
done 

이 하나가 우분투에서 쉘 (우분투에서 쉘을 돌진하는 링크) 나 SH에서 루프 구문 말할 수 내 스크립트입니다?

+1

을 수행 할 수 있습니다 - 나는 예기치 않은 파일의 끝을 얻는다. 어쨌든, 누락 된 세미콜론이 있습니다. –

+1

그게 나를 위해 작동합니다. 아마도 텍스트에 이상한 문자가 숨겨져있을 것입니다. – karlphillip

+0

bash에서는 구문이 정상적으로 보입니다. 올바른 쉘을 실행하고 있는지 확인할 수 있습니까? 'ls -l/bin/bash' 아마도? –

답변

31

아마도 이 아닌 bash으로 실행하십시오. 실행 가능한 경우 bash test1.sh 또는 ./test1.sh을 시도하고 sh test1.sh은 시도하지 마세요.

+0

게시판에 현재 표시된 bash에서 제대로 작동합니다. –

+0

Krelin : 네 말이 맞아. 나는 bash 또는 "./"대신 sh를 사용하여 실행했습니다. 그것은 지금 잘 작동합니다. 감사합니다 – mkab

+0

예 bash에서 잘 작동합니다. sh 지점을 bash (기호 링크)로 만드십시오! – abc

0

쉘 스크립트 (표시된대로)는 Korn 쉘과 Bash에서 실행됩니다. 몇 가지 생각 :

  • 세번 (#!/bin/bash가 아닌 #!/bin/bash) 뒤에 공백이 필요할 수 있습니다. 그러나 원래 Dennis Ritchie가 지정한 공간은 입니다. 게다가 Bourne 쉘에서 얻는 에러가 아닙니다 (대신 syntax error: '(' unexpected이됩니다).
  • Windows 시스템을 사용하고 있습니까? 어둠 속에서 그냥 찔러. 이것은 Windows 오류처럼 보이지 않습니다.
  • Solaris 또는 HP/UX 시스템입니까? Bash의 실제 버전이나 이전 버전을 실행하지 않을 수도 있습니다. 그러나 Bash의 가장 오래된 버전조차도 for ((x;y;z)) 구조를 인식합니다.

이 시도 : 실행되면서

  • set -xv

    #! /bin/bash 
    set -vx 
    echo "Random = $RANDOM" #Test for bash/Kornshell. Will be blank in other shells 
    echo \$BASH_VERSINFO[0] = ${BASH_VERSINFO[0]} #Should only work in BASH 
    echo \$BASH_VERSINFO[1] = ${BASH_VERSINFO[1]} 
    echo \$BASH_VERSINFO[2] = ${BASH_VERSINFO[2]} 
    echo \$BASH_VERSINFO[3] = ${BASH_VERSINFO[3]} 
    echo \$BASH_VERSINFO[4] = ${BASH_VERSINFO[4]} 
    echo \$BASH_VERSINFO[5] = ${BASH_VERSINFO[5]} 
    for ((c=0, c<=5, c++)) 
    do 
        echo "Welcome $c times" 
    done 
    
    가 모든 행을 표시합니다.
  • $RANDOM은 BASH 또는 Kornshell 인 경우 값을 표시해야합니다 (for 루프는 둘 중 하나에서 작동합니다).
  • {$BASH_VERINFO[x]}은 이것이 실제로 바스 (BASH) 인 경우에만 설정해야합니다. 이것들은 BASH 이후에 Korn shell을 실행하더라도 ($ SHELL과는 달리 여전히 bash을 포함합니다) 설정되지 않습니다.

for 루프가 여전히 문제가되는 경우 삭제하면됩니다. 이 스크립트의 어딘가에, 여러분이 실제로 bash 셸을 실행하고 있는지 아닌지를 알 수 있습니다.

5

POSIX 표준 쉘은 구문 for varname in list

구문 for ((expr1; expr2; expr3)) bashism가이기 - 루프 C 형을 받아 들인다.

당신은 for c in $(seq 1 5)

0

ls -l /bin/sh 

가 컴퓨터에 무엇을 주는가 사용하여 표준 POSIX 쉘에서 비슷한 동작을 얻을 수 있나요?나는 그것에 대해 당신과 같은 오류가 발생하지 않는

bashsh 심볼릭 링크를 확인하고 당신은 sh ./test1.sh