Linux do done loop

Syntax for a single-line while loop in Bash

I am having trouble coming up with the right combination of semicolons and/or braces. I’d like to do this, but as a one-liner from the command line:

while [ 1 ] do foo sleep 2 done 

15 Answers 15

while true; do foo; sleep 2; done 

By the way, if you type it as a multiline (as you are showing) at the command prompt and then call the history with arrow up, you will get it on a single line, correctly punctuated.

$ while true > do > echo "hello" > sleep 2 > done hello hello hello ^C $ while true; do echo "hello"; sleep 2; done 

«if you type it as a multiline (as you are showing) at the command prompt and then call the history with arrow up, you will get it on a single line, correctly punctuated.» was not true for me.

Excellent! Works perfectly on Mavericks (Mac OS-X 10.9) and allows me to keep a vpn running. Openconnect disconnects after a few hours with a bad cookie error. So I put the openconnect command in a shell script, sudo su to become root, and use this cmd line: while true; do sh /Users/myuser/bin/vpn ; done

It’s also possible to use sleep command in while’s condition. Making one-liner looking more clean imho.

while sleep 2; do echo thinking; done 

Well this does more than just changing the syntax — it will execute the command after the sleep. In the previous answer, the command is executed right away. Just something to note.

@DanGordon while echo thinking ; do sleep 2 ; done Of course if the [while] command fails, the loop exits, so you would have to while echo thinking || true ; do sleep 2 ; done but then you are back to while true ; .

while :; do foo; sleep 2; done 

@Pineapple Under the Sea: From the bash man page: (in section SHELL BUILTIN COMMANDS) : [arguments] No effect; the command does nothing beyond expanding arguments and performing any specified redirections. A zero exit code is returned.

Читайте также:  Install rider for linux

@avner: recommended by whom? true is a builtin in dash and bash as well. And while posix requires true only as executable they write: «even though the shell special built-in : provides similar functionality, because * true«* is widely used in historical scripts and *is less cryptic to novice script readers*. ( IEEE Std 1003.1-2001). See also this question

You can use semicolons to separate statements:

$ while [ 1 ]; do foo; sleep 2; done 

You can also make use of until command:

until ((0)); do foo; sleep 2; done 

Note that in contrast to while , until would execute the commands inside the loop as long as the test condition has an exit status which is not zero.

while read i; do foo; sleep 2; done < /dev/urandom 
until [ ]; do foo; sleep 2; done 
while true; do echo 'while'; sleep 2s; done 
for ((;;)); do echo 'forloop'; sleep 2; done 

Using Recursion , (a little bit different than above, keyboard interrupt won't stop it)

Careful using units in sleep , like sleep 1h . In my zsh, it ignores the unit h and runs my command every 1 second. Do a quick man sleep to see what your environment's sleep command supports first. May save you a headache.

A very simple infinite loop.. 🙂

while true ; do continue ; done 

Fr your question it would be:

while true; do foo ; sleep 2 ; done 

For simple process watching use watch instead

I like to use the semicolons only for the WHILE statement, and the && operator to make the loop do more than one thing.

So I always do it like this

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 

Well, the use of && in the loop is the same as any other time really isn't it. Do you need the second thing to happen only if the first happens, then use && else ; suffices. Really, you want to keep the contents of that loop short and simple, ideally just one command, so a function or a script.

Читайте также:  Загрузка приложений в linux

Careful using units in sleep , like sleep 1h . In my zsh, it ignores the unit h and runs my command every 1 second. Do a quick man sleep to see what your environment's sleep command supports first. May save you a headache.

If you want the while loop to stop after some condition, and your foo command returns non-zero when this condition is met then you can get the loop to break like this:

while foo; do echo 'sleeping. '; sleep 5; done; 

For example, if the foo command is deleting things in batches, and it returns 1 when there is nothing left to delete.

This works well if you have a custom script that needs to run a command many times until some condition. You write the script to exit with 1 when the condition is met and exit with 0 when it should be run again.

For example, say you have a python script batch_update.py which updates 100 rows in a database and returns 0 if there are more to update and 1 if there are no more. The the following command will allow you to update rows 100 at a time with sleeping for 5 seconds between updates:

while batch_update.py; do echo 'sleeping. '; sleep 5; done; 

Источник

Оцените статью
Adblock
detector