【问题标题】:syntax of for loop in linux shell scriptinglinux shell脚本中for循环的语法
【发布时间】:2011-08-03 09:17:01
【问题描述】:

我在实现 for 循环时遇到问题。执行脚本时出现此错误

test1.sh: 2: 语法错误:循环变量错误

我不明白这个错误。

这是我的脚本

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

谁能告诉我 ubuntu 中 sh 中 for 循环的语法(在 ubuntu 中它链接到 dash shell)shell?

【问题讨论】:

  • 我没有收到与您相同的错误 - 我收到意外的文件结尾。无论如何,你少了一个分号。
  • 这对我有用。您可能在文本中隐藏了一个奇怪的字符。
  • 对于 bash,语法似乎很好。你能试着确保你运行的是正确的 shell 吗? ls -l /bin/bash,也许?
  • 当您将 done 语句放在单独的行上时,这对我有用。
  • 我使用 sh 而不是 bash 运行它。在 bash 中运行良好。谢谢大家。

标签: linux bash shell for-loop dash-shell


【解决方案1】:

您可能使用sh 运行它,而不是bash。试试bash test1.sh,或者./test1.sh,如果它是可执行的,但不是sh test1.sh

【讨论】:

  • 在 bash 中工作正常,如帖子中当前显示的那样
  • 克里林:你说得对。我使用 sh 而不是 bash 或“./”来运行它。现在效果很好。谢谢
  • Yes 在 bash 中可以正常工作。使 sh 指向 bash(符号链接)!
【解决方案2】:

标准 POSIX shell 只接受语法for varname in list

类似 C 的 for 循环语法 for (( expr1; expr2; expr3 )) 是一种 bashism。

您可以使用 for c in $(seq 1 5) 在标准 POSIX shell 中获得类似的行为

【讨论】:

    【解决方案3】:

    是什么

    ls -l /bin/sh
    

    给你的机器?

    sh 设为bash 的符号链接,然后您就可以使用sh ./test1.sh

    【讨论】:

      【解决方案4】:

      您的 shell 脚本(如图所示)在 Korn shell 和 Bash 中运行。一些想法:

      • 在 shebang 之后可能需要一个空格(#!/bin/bash 而不是 #!/bin/bash)。但是,Dennis Ritchie 最初指定空格是可选。此外,这不是您使用 Bourne shell 时遇到的错误(您会收到 syntax error: '(' unexpected)。
      • 您使用的是 Windows 系统吗?只是在黑暗中刺伤。这看起来不像是 Windows 错误。
      • 这是 Solaris 还是 HP/UX 系统?他们可能没有运行真正版本的 Bash,或者可能不是旧版本。但是,即使是最旧版本的 Bash 也可以识别 for ((x;y;z)) 构造。

      试试这个:

      #! /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
      
      • set -xv 将在执行时显示所有行。
      • $RANDOM 应该显示一个值,如果它是 BASH 或 Kornshell(您的 for 循环将在任何一个中工作)。
      • {$BASH_VERINFO[x]} 只有在真正是 BASH 时才应设置。即使您在 BASH 中运行 Korn shell,也不会设置这些(不像 $SHELL 仍然包含 bash)。

      如果 for 循环仍然给您带来麻烦,请将其删除。在这个脚本的某个地方,我们会发现你是否真的在执行 bash shell。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-19
        • 2013-12-21
        • 2013-12-13
        • 2018-05-16
        • 2023-03-18
        • 2022-05-17
        • 1970-01-01
        相关资源
        最近更新 更多