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命令。替代方案是awk或bc例如:
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 中使用循环,那么您很可能会采用错误的方法。
在第 5 行:更改$x=(($x + 1))为x=$(($x + 1))。
无需使用整个 bash 脚本,您只需使用seq 1 50.
如果情况是x=$(($x + 2)),则可以使用seq 1 2 50,其中 2 表示步长/增量。
打印 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)
其他答案可能会解决如何调试脚本。此答案向您展示了一种更简单(且不易出错)的方法,可以使用Bash 的大括号扩展来生成范围而不是递增循环来执行您想要的操作。
例如,要使用此表示法打印数字 1 到 50,您可以使用以下代码段:
for x in {1..50}; do
echo $x
done
Run Code Online (Sandbox Code Playgroud)
这将按顺序正确打印每个数字,但依赖于无法跨 shell 移植的 Bash 功能。如果您需要可移植性,请考虑改用seq。