У мене виникають проблеми з правильним поєднанням крапки з комою та / або дужками. Я хотів би це зробити, але як однолінійний з командного рядка:
while [ 1 ]
do
foo
sleep 2
done
У мене виникають проблеми з правильним поєднанням крапки з комою та / або дужками. Я хотів би це зробити, але як однолінійний з командного рядка:
while [ 1 ]
do
foo
sleep 2
done
Відповіді:
while true; do foo; sleep 2; done
До речі, якщо ви введете його як багаторядковий (як ви показуєте) у командному рядку, а потім зателефонуйте історію стрілкою вгору, ви отримаєте її в одному рядку, правильно розділеному знаком.
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
опцію, якщо ви використовуєте bash?
while true; do sh /Users/myuser/bin/vpn ; done
Також можна використовувати команду сну в режимі, поки він знаходиться. Зробіть однолінійний вигляд більш чистим.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
Звичайно, якщо команда [while] не вдасться, цикл завершується, тож вам доведеться це зробити, while echo thinking || true ; do sleep 2 ; done
але тоді ви повернетесь доwhile true ; ...
Колона завжди "справжня":
while :; do foo; sleep 2; done
: [arguments]
Без ефекту; команда не робить нічого, крім розширення аргументів та виконання будь-яких заданих перенаправлень. Повертається нульовий код виходу.
Ви можете використовувати крапки з комою для розділення виписок:
$ while [ 1 ]; do foo; sleep 2; done
Ви також можете скористатися until
командою:
until ((0)); do foo; sleep 2; done
Зауважте, що на відміну від while
, until
виконував би команди всередині циклу до тих пір, поки умова тесту має статус виходу, який не дорівнює нулю.
Використання while
циклу:
while read i; do foo; sleep 2; done < /dev/urandom
Використання for
циклу:
for ((;;)); do foo; sleep 2; done
Інший спосіб використання until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
Чи не схоже на роботу. Це безперервне нескінченне.
Мені подобається використовувати крапки з комою лише для оператора WHILE, а оператор && змушує цикл робити більше, ніж одне.
Тому я завжди роблю це так
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
&&
циклу таке саме, як і будь-який інший час насправді не так. Чи потрібно, щоб друге, що трапилося, тільки якщо відбудеться перше, тоді використовувати &&
інше ;
достатньо. Дійсно, ви хочете, щоб вміст цього циклу був коротким та простим, в ідеалі - лише однією командою, тобто функцією чи сценарієм.
Для простого перегляду процесів використовуйте watch
натомість
Використання while
:
while true; do echo 'while'; sleep 2s; done
Використання for
циклу:
for ((;;)); do echo 'forloop'; sleep 2; done
Використання Recursion
, (трохи інше, ніж вище, перерва на клавіатурі не зупинить це)
list(){ echo 'recursion'; sleep 2; list; } && list;
Якщо ви хочете, щоб цикл while зупинився після деякої умови, і ваша foo
команда повертає ненульовий показник, коли ця умова виконана, ви можете отримати цикл, щоб розірватися так:
while foo; do echo 'sleeping...'; sleep 5; done;
Наприклад, якщо foo
команда видаляє речі партіями, і вона повертає 1, коли не залишається нічого для видалення.
Це добре працює, якщо у вас є власний скрипт, якому потрібно виконувати команду багато разів, до певної умови. Ви пишете сценарій для виходу з, 1
коли умова виконана, і вихід з, 0
коли її слід запустити знову.
Наприклад, скажімо, що у вас є сценарій python, batch_update.py
який оновлює 100 рядків у базі даних та повертає, 0
якщо є більше для оновлення та 1
якщо їх більше немає. Наступна команда дозволить вам оновлювати рядки 100 одночасно із сплячим режимом протягом 5 секунд між оновленнями:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
команду вихід з кодом, 1
коли ви хочете, щоб цикл while перервався. Я оновив свою відповідь прикладом.
Якщо я можу навести два практичні приклади (з трохи "емоції").
Це записує ім'я всіх файлів, які закінчилися ".jpg" у папку "img":
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
Це видаляє їх:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
Просто намагаюся зробити свій внесок.
ls -1 *.jpg
іrm *.jpg
Ви також можете спробувати це ПОПЕРЕДЖЕННЯ: цього робити не слід, але оскільки питання вимагає нескінченного циклу без кінця ... ось так ви могли це зробити.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done