Tôi gặp khó khăn khi đưa ra sự kết hợp đúng của dấu chấm phẩy và / hoặc niềng răng. Tôi muốn làm điều này, nhưng như một lớp lót từ dòng lệnh:
while [ 1 ]
do
foo
sleep 2
done
Tôi gặp khó khăn khi đưa ra sự kết hợp đúng của dấu chấm phẩy và / hoặc niềng răng. Tôi muốn làm điều này, nhưng như một lớp lót từ dòng lệnh:
while [ 1 ]
do
foo
sleep 2
done
Câu trả lời:
while true; do foo; sleep 2; done
Nhân tiện, nếu bạn gõ nó dưới dạng đa dòng (như bạn đang hiển thị) tại dấu nhắc lệnh và sau đó gọi lịch sử bằng mũi tên lên, bạn sẽ nhận được nó trên một dòng duy nhất, được chấm câu chính xác.
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
tùy chọn nếu bạn đang sử dụng bash?
while true; do sh /Users/myuser/bin/vpn ; done
Cũng có thể sử dụng lệnh ngủ trong điều kiện. Làm một lớp lót trông imho sạch sẽ hơn.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
Tất nhiên nếu lệnh [while] không thành công, vòng lặp sẽ thoát, vì vậy bạn sẽ phải while echo thinking || true ; do sleep 2 ; done
quay lạiwhile true ; ...
Đại tràng luôn là "sự thật":
while :; do foo; sleep 2; done
: [arguments]
Không có hiệu lực; lệnh không làm gì ngoài việc mở rộng đối số và thực hiện bất kỳ chuyển hướng được chỉ định nào. Mã thoát không được trả về.
Bạn có thể sử dụng dấu chấm phẩy để phân tách các câu lệnh:
$ while [ 1 ]; do foo; sleep 2; done
Bạn cũng có thể sử dụng until
lệnh:
until ((0)); do foo; sleep 2; done
Lưu ý rằng ngược lại while
, until
sẽ thực thi các lệnh bên trong vòng lặp miễn là điều kiện kiểm tra có trạng thái thoát không bằng không.
Sử dụng một while
vòng lặp:
while read i; do foo; sleep 2; done < /dev/urandom
Sử dụng một for
vòng lặp:
for ((;;)); do foo; sleep 2; done
Một cách khác sử dụng until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
này dường như không hoạt động. Nó liên tục vô tận.
Tôi chỉ thích sử dụng dấu chấm phẩy cho câu lệnh WHILE và toán tử && để tạo vòng lặp làm nhiều việc ...
Vì vậy, tôi luôn luôn làm như thế này
while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
&&
trong vòng lặp cũng giống như bất kỳ lúc nào khác thực sự không phải vậy. Bạn có cần điều thứ hai chỉ xảy ra nếu điều đầu tiên xảy ra, sau đó sử dụng đủ &&
điều kiện khác ;
. Thực sự, bạn muốn giữ cho nội dung của vòng lặp đó ngắn gọn và đơn giản, lý tưởng chỉ là một lệnh, do đó, một chức năng hoặc một tập lệnh.
Đối với quá trình xem đơn giản sử dụng watch
thay thế
Sử dụng while
:
while true; do echo 'while'; sleep 2s; done
Sử dụng for
vòng lặp:
for ((;;)); do echo 'forloop'; sleep 2; done
Sử dụng Recursion
, (khác một chút so với ở trên, ngắt bàn phím sẽ không dừng được)
list(){ echo 'recursion'; sleep 2; list; } && list;
Nếu bạn muốn vòng lặp while dừng sau một số điều kiện và foo
lệnh của bạn trả về giá trị khác không khi điều kiện này được đáp ứng thì bạn có thể nhận được vòng lặp để phá vỡ như sau:
while foo; do echo 'sleeping...'; sleep 5; done;
Ví dụ: nếu foo
lệnh đang xóa mọi thứ theo lô và nó sẽ trả về 1 khi không còn gì để xóa.
Này hoạt động tốt nếu bạn có một kịch bản tùy chỉnh mà cần phải chạy một lệnh nhiều lần cho đến khi một số điều kiện. Bạn viết kịch bản để thoát 1
khi điều kiện được đáp ứng và thoát 0
khi nó sẽ được chạy lại.
Ví dụ: giả sử bạn có tập lệnh python batch_update.py
cập nhật 100 hàng trong cơ sở dữ liệu và trả về 0
nếu có thêm thông tin cập nhật và 1
nếu không có thêm. Lệnh sau sẽ cho phép bạn cập nhật hàng 100 cùng một lúc với ngủ trong 5 giây giữa các lần cập nhật:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
lệnh thoát với mã 1
khi bạn muốn vòng lặp while bị phá vỡ. Tôi đã cập nhật câu trả lời của mình bằng một ví dụ.
Nếu tôi có thể đưa ra hai ví dụ thực tế (với một chút "cảm xúc").
Đây viết tên của tất cả các file kết thúc với ".jpg" trong thư mục 'img':
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
Điều này xóa chúng:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
Chỉ cần cố gắng để đóng góp.
ls -1 *.jpg
vàrm *.jpg
Bạn cũng có thể thử điều này CẢNH BÁO: điều này bạn không nên làm nhưng vì câu hỏi đang yêu cầu vòng lặp vô hạn không có hồi kết ... đây là cách bạn có thể làm.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done