如何使用sudo命令运行带有for循环的脚本

时间:2015-06-27 16:40:21

标签: bash for-loop sudo

当我发现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

4 个答案:

答案 0 :(得分:4)

sudo中的shell不会进行大括号扩展。

$ 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 :(得分:1)

仅在Bash 4中支持{0..10..2}语法。

对于Bash 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

如果删除大括号扩展的步骤部分,您可以看到Bash 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

但是在Bash 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}

答案 2 :(得分: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

答案 3 :(得分:0)

好的,脚本应该是这样的:

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