如何通过 sudo 命令 运行 带有 for 循环的脚本
How to run a script with a for loop by sudo command
我正在编写脚本,当我发现 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 version:4.3.11(1)-发布
我不确定我是否理解正确,但是您可以使用下面的代码生成相同的输出。这是我的测试脚本
for i in $(seq 0 5)
do
echo "Welcome $(( $i * 2)) times"
done
Output
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times
可以找到有关 seq
命令的更多详细信息 here
好的,脚本应该是这样的:
for i in $(seq 0 5)
do
echo "Welcome $(( $i * 2)) times"
done
谢谢my-thoughts.
{0..10..2}
语法仅在 Bash 4.
中受支持
对于 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
编辑
正如 Nathan Wilson 正确指出的那样,这可能是 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}
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()
。
我正在编写脚本,当我发现 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 version:4.3.11(1)-发布
我不确定我是否理解正确,但是您可以使用下面的代码生成相同的输出。这是我的测试脚本
for i in $(seq 0 5)
do
echo "Welcome $(( $i * 2)) times"
done
Output
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times
可以找到有关 seq
命令的更多详细信息 here
好的,脚本应该是这样的:
for i in $(seq 0 5)
do
echo "Welcome $(( $i * 2)) times"
done
谢谢my-thoughts.
{0..10..2}
语法仅在 Bash 4.
对于 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
编辑
正如 Nathan Wilson 正确指出的那样,这可能是 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}
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()
。