我运行下面的脚本:
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
更多详细信息,请参阅)。
您的原始脚本(( 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
,您可以:
将它作为参数运行到bash
eg bash script.sh
(您不需要使脚本可执行)
使脚本可执行并从bash
shell 运行(从包含脚本的目录):
./script.sh
Run Code Online (Sandbox Code Playgroud)最便携的方法是使用shebang(#!/bin/bash
或最好#!/usr/bin/env bash
)作为脚本的第一行。通过这种方式,您可以从任何 shell 运行脚本./script.sh
,脚本将被解释为bash
脚本,因此将相应地执行。
以为我会为讨论做出一点贡献。
已经提到您的脚本中使用的语法是一种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
归档时间: |
|
查看次数: |
70170 次 |
最近记录: |