2015-06-27 18 views
5

Tôi đã tạo một kịch bản, khi tôi tìm thấy một vấn đề với lệnh sudo và cho vòng lặp.Làm thế nào để chạy một kịch bản với vòng lặp for bởi lệnh sudo

Tôi có kịch bản thử nghiệm này

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

đầu ra bình thường phải được điều này:

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

Nhưng nó cho thấy điều này: Welcome {0..10..2} times bất kỳ ý tưởng?

bash phiên bản: 4.3.11 (1) -release

+0

thử 'for i in $ (seq 0 2 10)' –

+0

Hw là bạn đang chạy tập lệnh, đoán bạn đang sử dụng sh. Sử dụng bash. – 123

+0

Không, nó cho tôi thấy điều này: Chào mừng 0 lần có hoặc không có sudo , tôi đang sử dụng bash –

Trả lời

4

Vỏ trong sudo không làm mở rộng cú đúp.

$ 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 

Sử dụng seq() như những người khác đã đề xuất.

+1

Và bạn có thể thay đổi điều này bằng 'set -B' hoặc' set + B' – dawg

0

Tôi không chắc chắn nếu tôi đã hiểu bạn một cách chính xác, nhưng bạn có thể sử dụng dưới mã để tạo đầu ra tương tự. Đây là kịch bản thử nghiệm của tôi

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 

Xem chi tiết trên seq lệnh có thể được tìm thấy here

+0

Ok, tính năng này hoạt động! –

+0

Ngoài ra, hãy nhớ chấp nhận câu trả lời của bạn (tất cả chúng) nếu họ đã cho bạn câu trả lời thỏa đáng (bằng cách nhấp vào dấu tích ở bên trái câu trả lời), nó sẽ hữu ích cho cộng đồng – TheCodingFrog

+0

Nhưng điều này không trả lời câu hỏi tại sao 'Welcome {0..10..2} lần' đang nhận được kết quả đầu ra. Câu trả lời bạn viết cũng có thể được viết là 'cho tôi bằng $ (seq 0 2 10); làm echo "Chào mừng $ i lần"; done' như đã đề cập trong các bình luận của @ReutSharabani –

0

Ok, kịch bản phải được điều này:

for i in $(seq 0 5) do echo "Welcome $(($i * 2)) times" done cảm ơn bạn my-thoughts.

+0

Bạn có thể sử dụng '$ (seq 0 2 10)' như đã đề cập trong bình luận bởi @ReutSharabani, và trong vòng lặp 'echo' Chào mừng $ i lần "' –

+0

có, nhưng điều đó không hiệu quả. Ít nhất không phải cho tôi như tôi đã đề cập –

1

Cú pháp {0..10..2} chỉ được hỗ trợ trong Bash 4.

Đối với Bash 3, sử dụng cú pháp này để thay thế:

$ 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 

Bạn có thể xem những gì đang xảy ra trong Bash 3.2 nếu bạn loại bỏ các phần của bước việc mở rộng cú đúp:

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 

NHƯNG trên Bash 4, nó hoạt động như bạn mong muốn nó để:

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 

Sửa

Như Nathan Wilson một cách chính xác chỉ ra, điều này có lẽ là kết quả của sự lựa chọn Bash braceexpand là tiêu cực.

Bạn có thể đặt giá trị này với 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

Tôi có 4.3.11 (1) -release –

+0

Nó đang được thực hiện bởi Bash 3 mà không có bạn nhận thức được điều đó. Hãy thử chèn 'echo $ BASH_VERSION' – dawg

+0

tốt, nó không hoạt động đối với tôi. –

Các vấn đề liên quan