syntax of for loop in linux shell scripting

前端 未结 4 1762
故里飘歌
故里飘歌 2020-12-03 05:39

I have a problem implementing a for loop. I get this error when I execute my script

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

相关标签:
4条回答
  • 2020-12-03 05:39

    Your shell script (as shown) runs in both Korn shell and Bash. Some thoughts:

    • You might need a space after the shebang (#! /bin/bash and not #!/bin/bash). However, Dennis Ritchie had originally specified the space is optional. Besides, it isn't the error you get with Bourne shell (you get syntax error: '(' unexpected instead).
    • Are you on a Windows system? Just a stab in the dark. This doesn't look like a Windows error.
    • Is this Solaris or HP/UX system? They might not be running true versions of Bash, or maybe an older version. However, even the oldest version of Bash recognizes the for ((x;y;z)) construct.

    Try this:

    #! /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
    
    • The set -xv will display all lines as they are executed.
    • The $RANDOM should display a value if this is either BASH or Kornshell (your for loop will work in either one).
    • The {$BASH_VERINFO[x]} should only be set if this is truly BASH. These aren't even set even if you run Korn shell after you're in BASH (unlike $SHELL which will still contain bash).

    If the for loop still gives you trouble, just delete it. Somewhere in this script, we'll find out if you're really executing a bash shell or not.

    0 讨论(0)
  • 2020-12-03 05:50

    What does

    ls -l /bin/sh
    

    give on your machine ?

    Make sh a symbolic link to bash and then you can do sh ./test1.sh

    0 讨论(0)
  • 2020-12-03 05:56

    You probably run it with sh, not bash. Try bash test1.sh, or ./test1.sh if it's executable, but not sh test1.sh.

    0 讨论(0)
  • 2020-12-03 05:58

    A standard POSIX shell only accepts the syntax for varname in list

    The C-like for-loop syntax for (( expr1; expr2; expr3 )) is a bashism.

    You can get similar behavior in the standard POSIX shell using for c in $(seq 1 5)

    0 讨论(0)
提交回复
热议问题