首页 > 解决方案 > linux bash脚本错误

问题描述

当我尝试运行此脚本时

for ((i=1; i<=5; i++))
do
for ((j=1; j<=5; j++))
do
echo –n $i
done
echo " "
done

我收到此错误:

syntax error near unexpected token '(('

for ((j=1; j<=5; j++))"

标签: bash

解决方案


看来您正在使用不是 bash 的解释器运行它。我已经缩进了您的代码,但它也可以在没有缩进的情况下正常工作。

$ cat test.bash
for ((i=1; i<=5; i++))
do
  for ((j=1; j<=5; j++))
  do
    echo –n $i
  done
  echo " "
done
$ /bin/sh test.bash
/tmp/test.bash: 1: Syntax error: Bad for loop variable
$ echo $BASH_VERSION
5.0.11(1)-release
$ bash test.bash
–n 1
–n 1
–n 1
–n 1
–n 1

–n 2
–n 2
…

如您所见,echo -n不可靠。将该行更改printf %s $i为解决该问题,您的输出将变为:

11111 
22222 
33333 
44444 
55555 

如果你用 bash 调用它,也许你的 bash 版本太旧了?您可以使用for i in {1..5}更兼容的东西(但不是有效的 POSIX),也可以for i in 1 2 3 4 5用于完全兼容 POSIX。如果您有 GNU coreutils,则可以for i in $(seq 5)改为使用(请参阅参考资料man seq)。

为了更好地接近您的预期逻辑,您还可以考虑一个while循环:

i=0
while [ $((++i)) -le 5 ]
do
  j=0
  while [ $((++j)) -le 5 ]
  do
    printf %s $i
  done
  echo " "
done

这在循环之前初始化i为零while,然后在与五比较时在测试条件中将其递增;第一个循环的第一次迭代递增i1,发现它确实小于或等于 ( -le) 5,因此继续。

(我正在使用$((…))算术表达式并++i在其中使用,因为更常见的方法是在递增之前i++返回 的值,而在递增之后返回 的值。)i ++ii


推荐阅读