bash脚本 - 无法获取循环工作

时间:2014-04-04 13:08:58

标签: linux bash for-loop

背景信息:

我试图按照此处发布的示例进行操作:http://www.cyberciti.biz/faq/bash-for-loop/ 我想使用名为" i"的控制变量循环9次。

问题说明

我的代码如下所示:

for i in {0..8..1}
do
  echo "i is $i"
  tmpdate=$(date -d "$i days" "+%b %d")
  echo $tmpdate
done

当我运行此代码时,调试打印显示:

                 "i is {0..8..1}" 

而不是0到8之间的值。

我迄今为止所做的检查:

我试图检查我的bash版本,以确保它支持这种语法。我正在运行版本4,2,25(1)

我也尝试过使用类似C语法的地方(i = 0; i< = 8; i ++),但这也不起作用。

任何建议将不胜感激。

感谢。

编辑1

我还尝试了以下代码:

for i in {0..8};
do
  echo "i is $i"
  tmpdate=$(date -d "$i days" "+%b %d")
  echo $tmpdate
done

和...

for i in {0..8}
do
  echo "i is $i"
  tmpdate=$(date -d "$i days" "+%b %d")
  echo $tmpdate
done

他们都失败了,结果相同。

我也尝试过:

#!/bin/bash

for ((i=0;i<9;i++));
do
  echo "i is $i"
  tmpdate=$(date -d "$i days" "+%b %d")
  echo $tmpdate
done

这给了我错误:

test.sh:4:test.sh:语法错误:循环变量错误

FYI。我在ubuntu 12上运行

编辑2

好的......所以我认为Weberick向我提出了这个问题...... 为了执行脚本,我正在运行&#34; sh test.sh&#34; 在代码中我将它定义为BASH脚本!我的坏!

但事情就是这样。最终,我需要它在bash和sh中工作。 所以,现在我要小心确保以正确的方式调用脚本......我注意到以下结果:

  1. 当定义为bash脚本并且我使用bash执行时,C风格版本可以正常工作!
  2. 当定义为sh脚本并且我使用sh执行时,C风格版本失败

    me @ devbox:〜/ tmp / test $ sh test.sh test.sh:5:test.sh:语法错误:循环变量错误

  3. 当定义为sh脚本并且我使用sh执行NON c样式版本(又名为{n ..x}中的i)时,我得到&#34;我是{0..8} &#34;输出。

  4. PS。 &#34 ;;&#34;如果你有下一行的做法,那就不会有所作为......仅供参考。

4 个答案:

答案 0 :(得分:5)

Ubuntu的默认shell是dash,它不会识别您尝试过的任何基础(支持扩展,C风格的循环)。尝试使用bash明确地运行脚本:

bash myscript.sh

或将shebang设置为#!/bin/bash。确保不要使用sh myscript.sh运行脚本。

如果您使用seq <:p>,

破折号应该有效

for i in $(seq 0 1 8); do
    echo "$i"
done

只有{0..8}才能在bash中使用,默认增量为1.如果要在bash中使用C风格的循环:

for ((i=0;i<9;i++)); do 
    echo "$i"
done

答案 1 :(得分:3)

我有信心

#!/bin/bash

for ((i=0;i<9;i++))
do
  echo "i is $i"
  tmpdate=$(date -d "$i days" "+%b %d")
  echo $tmpdate
done

在Ubuntu 12.04上工作

如果您仍有错误,可以试试吗

chmod +x test.sh

然后

./test.sh

结果是

i is 0
Apr 04
i is 1
Apr 05
i is 2
Apr 06
i is 3
Apr 07
i is 4
Apr 08
i is 5
Apr 09
i is 6
Apr 10
i is 7
Apr 11
i is 8
Apr 12

答案 2 :(得分:0)

您引用的网站

  

Bash v4.0 +内置了使用{START..END..INCREMENT}语法设置步长值的支持:

所以当你的bash版本大于4.0时你可以使用{0..8..1},我猜不是这种情况(在你的终端尝试bash --version)。您可以使用{0..8..1}而不是{0..8}

如果您使用的是旧版本,则可以在for循环中使用{START..END..INCREMENT}命令$(seq START INCREMENT END)而不是{{1}}。

答案 3 :(得分:0)

我不是bash的专家,但根据tdlp,你需要在for语句之后加;。一系列的方法有很多种。这是其中之一。

    #!/bin/bash
    for i in `seq 1 8`; do
        echo $i
    done