【问题标题】:Error with Bash script - syntax errorBash 脚本错误 - 语法错误
【发布时间】:2025-07-23 04:30:02
【问题描述】:

文件:test.sh

命令:sh test.sh

test.sh 的内容

   x=1
    while [ $x -le 5 ]
    do
      echo "Welcome $x times"
      x=$(( $x + 1 ))
    done

错误:

test.sh:第 6 行:附近有语法错误 意外令牌“完成”

test.sh:第 6 行:“完成”

GNU bash,版本 3.2.39(1)-release (x86_64-pc-linux-gnu)

【问题讨论】:

  • 这对我来说非常好。
  • 已解决:我尝试使用“pico”而不是通过 FTP 传输文件,一切正常!谢谢!

标签: bash


【解决方案1】:

这在我得到的系统上很奇怪。

Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times

必须与空格有关。

【讨论】:

    【解决方案2】:

    向分号问好。 :)

    x=1
    while [ $x -le 5 ]
    do
      echo "Welcome $x times";
      x=$(( $x + 1 ));
    done
    

    如果是一行,则不需要分号,但是,您可能希望这样循环:

    for i in `seq 1 5`
    do
      echo "Welcome $i times"
    done
    

    【讨论】:

    • 分号不相关。
    • seq 在 Bash 中不需要:for i in {1..5}for ((i=1;i<=5;i++))
    【解决方案3】:

    当我运行该代码时它可以工作。

    确保您使用 bash 而不是 sh 运行。 $(( )) 结构相对较新。

    【讨论】:

    • sh 下也为我工作。我的 sh 版本是 4.1。
    • @Rafe 在某些体系结构上,sh 是一个单独的、比 bash 功能更差的可执行文件。
    • 我有 GNU bash,版本 3.2.39(1)-release (x86_64-pc-linux-gnu)
    • 已解决:我尝试使用“pico”而不是通过 FTP 传输文件,一切正常!谢谢!
    • @Leonardo:检查您的 FTP 行尾转换。行尾对 bash 来说很重要,因为换行符标记了一个新语句,如果行尾被错误地翻译,语句就会混淆。您可以使用分号显式终止语句,但最好让文件传输正常工作。
    【解决方案4】:

    运行您的脚本:

    bash test.sh
    

    它会起作用的。主要有两种可能:

    • 当它以sh 运行时,bash 不一定能识别它以bash 运行时识别的所有语法。不过,在我测试过的 Linux 和 MacOS X 机器上,shbash 都运行良好。
    • 或者,您可能在运行 AIX、HP-UX、Solaris 或类似软件的机器上,其中 /bin/shbash 根本不是同一个 shell。它是更严格的 Bourne shell,您使用的符号无效 - 语法错误。

    【讨论】:

    • 那么仔细看看代码。可能,您有 CRLF (DOS) 行尾?不过,即使这样也有点牵强。我测试的 Linux 机器在 x86/64 上有 bash 3.2.25(1)。用od -c 查看你的代码;有充分的证据表明复制和粘贴的内容是可以的。也许尝试再次将它输入到 test2.sh 中,看看是否有效。这听起来很傻,但在这一点上,你的问题是最奇特的。