背景信息:
我试图按照此处发布的示例进行操作: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中工作。 所以,现在我要小心确保以正确的方式调用脚本......我注意到以下结果:
当定义为sh脚本并且我使用sh执行时,C风格版本失败
me @ devbox:〜/ tmp / test $ sh test.sh test.sh:5:test.sh:语法错误:循环变量错误
当定义为sh脚本并且我使用sh执行NON c样式版本(又名为{n ..x}中的i)时,我得到&#34;我是{0..8} &#34;输出。
PS。 &#34 ;;&#34;如果你有下一行的做法,那就不会有所作为......仅供参考。
答案 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