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

dot*_*dot 6 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
Run Code Online (Sandbox Code Playgroud)

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

                 "i is {0..8..1}" 
Run Code Online (Sandbox Code Playgroud)

而不是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
Run Code Online (Sandbox Code Playgroud)

和...

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

他们都失败了同样的结果.

我也尝试过:

#!/bin/bash

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

这给了我错误:

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

仅供参考.我在ubuntu 12上运行

编辑2

好吧......所以我认为Weberick向我提出了这个问题......为了执行脚本,我在代码中运行了"sh test.sh",我将其定义为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)时,我得到"i is {0..8}"输出.

PS.";" 如果你在下一行做了那就没有什么区别......只是我们.

Jos*_*lly 5

Ubuntu的默认外壳是dash,它无法识别您尝试过的任何一种bashism(括号扩展,C风格的for循环)。尝试使用bash显式运行脚本:

bash myscript.sh
Run Code Online (Sandbox Code Playgroud)

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

如果您使用破折号应该可以seq

for i in $(seq 0 1 8); do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

刚好在中{0..8}工作bash,默认增量为1。如果要在循环中使用C风格的循环bash

for ((i=0;i<9;i++)); do 
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)