shell脚本中的for循环语法

Aks*_*tel 6 scripts

我运行下面的脚本:

for (( i=1; i <= 5; i++ ))    
do
    echo "Random number $i: $RANDOM"
done
Run Code Online (Sandbox Code Playgroud)

我得到以下错误:

Syntax error: Bad for loop variable
Run Code Online (Sandbox Code Playgroud)

为什么这种语法不起作用?

evi*_*oup 12

正如 heemayl 的回答所指出的那样,您的构建是一种bashism。做你想做的事情的标准方法是:

for i in 1 2 3 4 5
do
  echo "Random number $i: $RANDOM"
done
Run Code Online (Sandbox Code Playgroud)

或者,更容易扩展:

for i in $(seq 1 5)
do
  echo "Random number $i: $RANDOM"
done
Run Code Online (Sandbox Code Playgroud)

(有关man seq更多详细信息,请参阅)。

  • 也不能说“seq”就是所有标准。这不是 POSIX。 (3认同)

hee*_*ayl 6

您的原始脚本(( i=1; i <= 5; i++ ))for循环中有一个构造,这是一种 bashism,因此dash.

在 Ubuntu 中sh是一个符号链接dash,所以当你运行时

sh ./script.sh
Run Code Online (Sandbox Code Playgroud)

你基本上在跑步

dash ./script.sh
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的dash,不理解类 C 的for循环结构,它显示了错误。

要使用 运行脚本bash,您可以:

  • 将它作为参数运行到basheg bash script.sh(您不需要使脚本可执行)

  • 使脚本可执行并从bashshell 运行(从包含脚本的目录):

    ./script.sh 
    
    Run Code Online (Sandbox Code Playgroud)
  • 最便携的方法是使用shebang(#!/bin/bash或最好#!/usr/bin/env bash)作为脚本的第一行。通过这种方式,您可以从任何 shell 运行脚本./script.sh,脚本将被解释为bash脚本,因此将相应地执行。


Ser*_*nyy 5

以为我会为讨论做出一点贡献。

已经提到您的脚本中使用的语法是一种bashism,因此不可移植,即使这是类似C 的并且熟悉java 和C 的人都很好理解。从在unix.stackexchange 上提出我自己的问题。 com ,我还学到了诸如先生成for i in $(seq 1 5)一组数字然后迭代之类的语法,如果您有一个非常大的集合,这可能会很浪费。

模拟 C 类行为的一种更好的方法是使用while循环,它具有一个可以递增的变量,它是可移植的。例如,

#!/bin/sh
number=0
while [ "$number" -lt 10 ]
do
        printf "\t%d" "$number"
        number=`expr $number + 1 `
done
Run Code Online (Sandbox Code Playgroud)

这适用于 bash, dash, zsh, ksh, mksh 。. . 或基本上任何与 bourne shell 相关的 shell。事实上,我有一本 1995 年的 Unix System V 书,我已经测试了他们的 bourne shell 示例,它仍然有效。行为也是类似 C 的 for 循环的行为:您有初始条件,在 中测试条件while [ . . .],并在最后更新条件。

csh 和 tcsh 的语法更接近 C 语言,但不能移植到其他 shell,不建议在脚本中使用它们。

补充

关于 $RANDOM 的可移植性,根据ubuntu wiki 上的这个页面,破折号随机数生成应该依赖于使用/dev/urandom