2015-06-27 165 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

好吧,它不適合我。 –