BASH Syntax error near unexpected token 'done'

前端 未结 12 789
轮回少年
轮回少年 2020-12-01 05:52

Any idea of what the problem could be?

My code is:

#!/bin/bash
while :
do
echo \"Press [CTRL+C] to stop..\"
sleep 1
done

Saved it a

相关标签:
12条回答
  • 2020-12-01 06:01

    I was getting the same error on Cygwin; I did the following (one of them fixed it):

    1. Converted TABS to SPACES
    2. ran dos2unix on the .(ba)sh file
    0 讨论(0)
  • 2020-12-01 06:02

    Edit your code in any linux environment then you won't face this problem. If edit in windows notepad any space take it as ^M.

    0 讨论(0)
  • 2020-12-01 06:03

    Run cat -v file.sh.

    You most likely have a carriage return or no-break space in your file. cat -v will show them as ^M and M-BM- or M- respectively. It will similarly show any other strange characters you might have gotten into your file.

    Remove the Windows line breaks with

    tr -d '\r' < file.sh > fixedfile.sh
    
    0 讨论(0)
  • 2020-12-01 06:03

    There's a way you can get this problem without having mixed newline problems (at least, in my shell, which is GNU bash v4.3.30):

    #!/bin/bash
    # foo.sh
    
    function foo() {
        echo "I am quoting a thing `$1' inside a function."
    }
    
    while [ "$input" != "y" ]; do
        read -p "Hit `y' to continue: " -n 1 input
        echo
    done
    
    foo "What could possibly go wrong?"
    
    $ ./foo.sh
    ./foo.sh: line 11: syntax error near unexpected token `done'
    ./foo.sh: line 11: `done'
    

    This is because bash expands backticks inside double-quoted strings (see the bash manual on quoting and command substitution), and before finding a matching backtick, will interpret any additional double quotes as part of the command substitution:

    $ echo "Command substitution happens inside double-quoted strings: `ls`"
    Command substitution happens inside double-quoted strings: foo.sh
    $ echo "..even with double quotes: `grep -E "^foo|wrong" foo.sh`"
    ..even with double quotes: foo "What could possibly go wrong?"
    

    You can get around this by escaping the backticks in your string with a backslash, or by using a single-quoted string.

    I'm not really sure why this only gives the one error message, but I think it has to do with the function definition:

    #!/bin/bash
    # a.sh
    
    function a() {
        echo "Thing's `quoted'"
    }
    a
    while true; do
        echo "Other `quote'"
    done
    
    #!/bin/bash
    # b.sh
    
    echo "Thing's `quoted'"
    while true; do
        echo "Other `quote'"
    done
    
    $ ./a.sh
    ./a.sh: line 10: syntax error near unexpected token `done'
    ./a.sh: line 10: `done'
    $ ./b.sh
    ./b.sh: command substitution: line 6: unexpected EOF while looking for matching `''
    ./b.sh: command substitution: line 9: syntax error: unexpected end of file
    Thing's quote'
    ./b.sh: line 7: syntax error near unexpected token `done'
    ./b.sh: line 7: `done'
    
    0 讨论(0)
  • 2020-12-01 06:09

    Open new file named foobar

    nano -w foobar
    

    Input script

     #!/bin/bash
     while [ 0 = 0 ]; do
       echo "Press [CTRL+C] to stop.."
       sleep 1
     done;
    

    Exit and save

    CTRL+X then Y and Enter

    Set script executable and run

    chmod +x foobar
    ./foobar
    
    0 讨论(0)
  • 2020-12-01 06:12

    What is the error you're getting?

    $ bash file.sh
    test.sh: line 8: syntax error: unexpected end of file
    

    If you get that error, you may have bad line endings. Unix uses <LF> at the end of the file while Windows uses <CR><LF>. That <CR> character gets interpreted as a character.

    You can use od -a test.sh to see the invisible characters in the file.

    $ od -a test.sh
    0000000    #   !   /   b   i   n   /   b   a   s   h  cr  nl   #  sp  cr
    0000020   nl   w   h   i   l   e  sp   :  cr  nl   d   o  cr  nl  sp  sp
    0000040   sp  sp   e   c   h   o  sp   "   P   r   e   s   s  sp   [   C
    0000060    T   R   L   +   C   ]  sp   t   o  sp   s   t   o   p   "  cr
    0000100   nl  sp  sp  sp  sp   s   l   e   e   p  sp   1  cr  nl   d   o
    0000120    n   e  cr  nl                                                
    0000124
    

    The sp stands for space, the ht stands for tab, the cr stands for <CR> and the nl stands for <LF>. Note that all of the lines end with cr followed by a nl character.

    You can also use cat -v test.sh if your cat command takes the -v parameter.

    If you have dos2unix on your box, you can use that command to fix your file:

    $ dos2unix test.sh
    
    0 讨论(0)
提交回复
热议问题