Bash (Bourne Again Shell) is a shell command prompt and scripting language in GNU/Linux operating systems. It is the default shell for most Linux distributions.
Like most scripting languages, Bash provides loop syntaxes to repeat similar tasks multiple times. In this article, we will learn how to use the until
loop in Bash.
Introduction
The until
loop in Bash is used to execute command(s) (executed commands) multiple times based on the output of another command(s) (condition commands). The executed commands will keep running till the condition command keeps on failing (i.e., returns a non zero status. Any command in Linux returns 0 for success and a non zero integer for failure). This is exactly opposite of while
loop, in which the executed commands keep on running till condition command is successful.
If there are multiple condition commands, the statement considers only the status of the last command in the list, i.e., the loop will run till the last command in the list keeps on failing.
General Syntax
The general syntax for until
loop in Bash is:
until <condition_command_list>
do
<execute_command_list>
done
The execute command list will run until the last command in the condition command list fails. Once the last command is successful, the loop exits.
Users can specify any executable file in the command lists. It can be standard Linux programs or custom user programs or scripts. Each command should be either on a new line or separated by a semicolon on the same line.
Let us see few examples.
Looping till a variable has a particular value: The following loop executes till the value of the variable x
is 10.
x=0
until [[ $x -eq 10 ]]
do
echo $x
((x++))
done
In each iteration, we are checking if the value of x is 10. The value is being checked using the test
command. [[ Expression ]]
is the syntax for test command (See man test
).
Then inside the do...done
block, we simply print the value of x, and increment it. The loop exits once the condition command is successful, i.e., when $x
is equal to 10
.
Note: The index variable to be used in ‘until’ loop is to be initialized either before the ‘until’ loop or in the condition commands, as opposed to for loop, which enables to initialize a variable implicitly.
With multiple condition commands : The following loop creates 5 directories named dir0, dir1, ... dir4
.
z=0
until
echo "Hi"
echo "Bye"
[[ $z -eq 5 ]]
do
echo "Creating dir$z..."
mkdir dir$z
((z++))
done
First commands echo “Hi” and echo “Bye” will execute once completely; their success or failure has no impact whatsoever on how long the loop will run.
Then the test command for checking the value of variable z will execute. Till this command keeps on failing, i.e., till the value of z is 5, the condition commands and executed commands keep running in order. Here, for each iteration, it will first run the 2 echo commands in condition and then 3rd condition command checks for the value of z. If it is not 5, it enters the loop and executes the given commands.
Break and Continue
Break Statement for Conditional Exit
We can also use the conditional statement if
inside the loop. The if
statement can be used with a break
a statement, for a conditional exit from the loop.
x=0
until [[ $x -eq 10 ]]
do
if [[ $x -eq 5 ]]
break
fi
echo $x
((x++))
done
The above until loop will print numbers from 0 to 4. Then when the value of i is 5, it will break out of the loop. This is of particular use when a loop is to be exited when a command gives a specific output.
Continue Statement to Skip an Iteration Conditionally
Bash also has a continue
statement to skip remaining part of an iteration in a loop if a particular condition is satisfied.
x=0
until [[ $x -eq 10 ]]
do
if [[ $x -eq 5 ]]
continue
fi
echo $x
((x++))
done
The above loop will print numbers from 0 to 10, except 5, because during the iteration of x=5
there is a continue statement, which will skip rest of the code in the loop at the start with the iteration of x=6
.
Using Loops: Scripts and Command Line
The loop syntaxes can be used in Bash shell directly or from an executable shell script file. Similar to for
and while
loops, once an until
loop syntax is entered on the shell, the shell continues the prompt to let the user continue the commands to be looped.
Or else, the user can save this in a script file and execute the script file.
The #!/bin/bash
at the start specifies the interpreter to be used when the file is executed. Although Bash is the most commonly used shell nowadays, some users do prefer shells like zsh
, which should be specified in place of bash at the start of this file.
To give execute permissions for this file, run:
chmod +x test.sh
Finally, to execute the file, run:
./test.sh
Conclusion
The until
loop is another important feature in Bash scripting. It has particular importance in complex scripts when a certain set of programs are expected to return fail status, and some other command(s) are to be executed to log the failure, display error in detail, or simply execute some alternate programs.
Member discussion