【问题标题】:bash script - can't get for loop workingbash 脚本 - 无法进行循环工作
【发布时间】:2014-05-16 19:48:21
【问题描述】:

背景信息:

我正在尝试遵循此处发布的示例: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

任何建议将不胜感激。

谢谢。

编辑 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: 语法错误:循环变量错误

仅供参考。我在 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 非 c 样式版本(又名 for i in {n ..x})执行时,我得到“i is {0..8}”输出。

PS。这 ”;”如果您在下一行有操作,则没有什么区别……仅供参考。

【问题讨论】:

  • 你的例子对我有用...
  • 我也认为你需要一个;,比如for i in {0..8};
  • 如何运行脚本?你是使用 'bash myscript.sh' 还是添加了 '#!/bin/bash'?
  • 也很好奇脚本是如何运行的(即你是在做sh myscript.sh 还是./myscript.sh? - Ubuntu 的默认 shell 是 dash,它无法识别其中的某些语法)跨度>
  • 这就是我所怀疑的,您实际上根本没有运行 bash。 ubuntu 可能创建了一个从 /bin/bash 到 dash 的链接。

标签: linux bash for-loop


【解决方案1】:

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

bash myscript.sh

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

如果你使用seq,破折号应该可以工作:

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

{0..8} 应该在bash 中工作,默认增量为 1。如果你想在 bash 中使用 C 风格的 for 循环:

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

【讨论】:

  • 这就是我要找的!它使用 seq 双向工作。通过“bash test.sh”或“sh test.sh”调用。谢谢。
  • 晚了 6 年,但这只是帮助了我,非常感谢 :)
【解决方案2】:

我相信

#!/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

【讨论】:

    【解决方案3】:

    你引用的网站说

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

    因此,当您的 bash 版本大于 4.0 时,您可以只使用{0..8..1},我猜不是这样(在您的终端中尝试bash --version)。除了{0..8..1},您还可以使用{0..8}

    如果您有旧版本,则可以在 for 循环中使用命令 $(seq START INCREMENT END) 代替 {START..END..INCREMENT}

    【讨论】:

      【解决方案4】:

      我不是 bash 方面的专家,但根据 tdlp 您需要在 for 语句后添加 ;。有很多方法可以到达一个范围。这是其中之一。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多