打印 1-50 之间的数字

Wan*_*der 8 bash shell-script

x=1
while [ $x -le 50 ]
do
    echo $x
    $x=(($x + 1))
done
Run Code Online (Sandbox Code Playgroud)

我已经写了上面的代码。在许多编程语言中似乎是一项简单的任务,却为我提供了这个错误。

solution.sh: line 5: syntax error near unexpected token `('
solution.sh: line 5: `    $x=(($x + 1))'
Run Code Online (Sandbox Code Playgroud)

如何调试 bash 中的错误。有没有IDE?

Sté*_*las 14

shell 不是(好的)编程语言,它(首先)是命令行解释器。如果要计数,请使用计数命令,而不是循环中的echoand[命令。

例如,GNU 系统有这个seq命令。替代方案是awkbc例如:

seq 50
echo 'for (i=1; i<=50; i++) i' | bc
awk 'BEGIN {for (i=1; i<= 50; i++) print i}'
Run Code Online (Sandbox Code Playgroud)

如果您发现自己在 shell 中使用循环,那么您很可能会采用错误的方法。

  • Shell 的美妙之处在于它的命令可以完成大多数常用但难以实现的事情。在这种情况下,`seq 50` 是 OP 问题的一个正确答案:这就是在 shell 中打印数字 1-50 的方式。 (3认同)
  • @SF。如果你想要 shell,`seq` 几乎不是“正确”的方式。`echo {1..50}`(或 `printf`)可以说是 shell 的方式。 (2认同)
  • Stéphane,我只想和你争论在 bash 中有很多时候使用循环。循环是一种基本的编程结构,甚至适用于 shell(尽管不可否认,在大多数情况下使用 foreach 循环更有意义)。 (2认同)

Man*_*nde 9

在第 5 行:更改$x=(($x + 1))x=$(($x + 1))

无需使用整个 bash 脚本,您只需使用seq 1 50.

如果情况是x=$(($x + 2)),则可以使用seq 1 2 50,其中 2 表示步长/增量。

  • @muru,对很多人来说,是的,确实如此。而且我的评论不是针对 OP 的(此外只是关于在一般情况下两者好处的一般信息)。 (2认同)

αғs*_*нιη 8

打印 1-50 之间的数字

printf '%s\n' {1..50}
Run Code Online (Sandbox Code Playgroud)

打印 1-50 的数字,步骤说 2(bash 4+):

printf '%s\n' {1..50..2}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ome 7

使用支撑扩展范围

其他答案可能会解决如何调试脚本。此答案向您展示了一种更简单(且不易出错)的方法,可以使用Bash 的大括号扩展来生成范围而不是递增循环来执行您想要的操作。

例如,要使用此表示法打印数字 1 到 50,您可以使用以下代码段:

for x in {1..50}; do
    echo $x
done 
Run Code Online (Sandbox Code Playgroud)

这将按顺序正确打印每个数字,但依赖于无法跨 shell 移植的 Bash 功能。如果您需要可移植性,请考虑改用seq