2015-06-27 245 views
5

当我发现sudo命令和for循环出现问题时,我正在创建一个脚本。如何使用sudo命令通过for循环运行脚本

我有这样的测试脚本

for i in {0..10..2} 
do 
    echo "Welcome $i times" 
done 

正常输出应该是这样的:

Welcome 0 times 
Welcome 2 times 
Welcome 4 times 
Welcome 6 times 
Welcome 8 times 
Welcome 10 times 

但它显示了这一点:Welcome {0..10..2} times 任何想法?

bash的版本:4.3.11(1)-release

+0

尝试'为我$(seq 0 2 10)' –

+0

你是否运行脚本,猜测你正在使用sh。使用bash。 – 123

+0

不,它告诉我这个:欢迎0次有或没有sudo ,我使用bash –

回答

4

sudo外壳没有做括号扩展。

$ cat s.sh 
echo $SHELL 
echo $SHELLOPTS 
for i in {0..10..2} 
     do 
     echo "Welcome $i times" 
     done 

$ ./s.sh 
/bin/bash 
braceexpand:hashall:interactive-comments 
Welcome 0 times 
Welcome 2 times 
Welcome 4 times 
Welcome 6 times 
Welcome 8 times 
Welcome 10 times 

$ sudo ./s.sh 
/bin/bash 

Welcome {0..10..2} times 

使用seq()正如其他人所建议的。

+1

你可以用'set -B'或'set + B'来改变它 – dawg

0

我不知道如果我理解正确的,但是你可以用下面的代码来生成相同的输出。这里是我的测试脚本

for i in $(seq 0 5) 
    do 
    echo "Welcome $(($i * 2)) times" 
done 

输出

Welcome 0 times 
Welcome 2 times 
Welcome 4 times 
Welcome 6 times 
Welcome 8 times 
Welcome 10 times 
seq命令

更多细节可以发现here

+0

好的,这个工程! –

+0

另外,如果他们给了您满意的答案(通过点击答案左侧的勾号),请记得接受您的答案(全部答案),这对社区会有所帮助 – TheCodingFrog

+0

但是这并没有回答为什么'Welcome {0..10..2} times'正在输出的问题。你写的答案也可以写成'for i in $(seq 0 2 10);确实回应“欢迎$ i次”;完成“,如@ReutSharabani –

0

好,脚本应该是这样的:

for i in $(seq 0 5) do echo "Welcome $(($i * 2)) times" done谢谢你my-thoughts

+0

你可以使用'@(seq 0 2 10)'在@ReutSharabani评论中提到的,在for循环'echo“欢迎$ i次”' –

+0

是的,但这不起作用。至少不适合我,因为我已经提到 –

1

{0..10..2}语法只支持在猛砸4

对于猛砸3,使用语法来代替:

$ for ((i=0; i<=10; i+=2)); do echo "Welcome $i times"; done 
Welcome 0 times 
Welcome 2 times 
Welcome 4 times 
Welcome 6 times 
Welcome 8 times 
Welcome 10 times 

你可以看到什么是在3.2猛砸发生,如果你删除的台阶部支架扩张:

bash-3.2$ for i in {0..10..2}; do echo "i=>$i"; done 
i=>{0..10..2} 
bash-3.2$ for i in {0..10}; do echo "i=>$i"; done 
i=>0 
i=>1 
i=>2 
i=>3 
i=>4 
i=>5 
i=>6 
i=>7 
i=>8 
i=>9 
i=>10 

但猛砸4,它可以作为你期望它来:

bash-4.3$ for i in {0..10..2}; do echo "i=>$i"; done 
i=>0 
i=>2 
i=>4 
i=>6 
i=>8 
i=>10 

编辑

弥敦道威尔逊正确地指出,这很可能是负的Bash选项braceexpand的结果。

您可以set设置这个值:

$ echo $SHELLOPTS 
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor:posix 
$ for i in {0..5}; do echo "i=>$i"; done 
i=>0 
i=>1 
i=>2 
i=>3 
i=>4 
i=>5 
$ set +B 
$ echo $SHELLOPTS 
emacs:hashall:histexpand:history:interactive-comments:monitor:posix 
$ for i in {0..5}; do echo "i=>$i"; done 
i=>{0..5} 
+0

我有4.3.11(1)-release –

+0

它是由Bash 3执行,而你没有意识到这一点。尝试插入'echo $ BASH_VERSION' – dawg

+0

好吧,它不适合我。 –