BASH Flow Control
BASH provides a number of flow control constructs.
if pipeline then success-commands [elif pipeline2 else-if-commands ] [else alt-commands ] fi
Executes success-commands if pipeline returns an exit code of zero.
If success-commands returns a non-zero exit code and pipeline2 returns an exit code of zero, executes else-if-commands.
Otherwise, executes alt-commands.
if grep -q "jason" /etc/passwd then echo "the user 'jason' exists in the passwd file." else echo "the user 'jason' does not exist in the passwd file." fi
echo -n "Are you sure you wish to remove '$file'?" read YN if [ "$YN" = "y" -o "$YN" = "Y" ] then echo "Deleting '$file'..." rm "$file" else echo "Aborted. '$file' not deleted." fi
if [ "$(date +%Y)" -lt 2010 ] then echo "Still waiting for the Whistler Olympics." fi
while pipeline do commands done
Executes commands once for each time that pipeline returns a true result (exit code of zero). Example:
num=1 while [ $num -le 5 ] do echo $num num=$[ $num + 1 ] done
In this case it will just print number 1 to 5
while (( 1 )) do eject -T done
Try executing this script on your pc
for variable in list do commands done
for COLOUR in red blue green do print "$COLOUR" done
for FILE in /etc/* do if [ -x $FILE ] then echo "$FILE is executable" fi done
for MOUNT in $(mount|sed "/\//s/^.*on \([^ ]*\) .*$/\1/") do du -sx $MOUNT done
This is a C-style for loop:
for (( variable=start ; condition ; interation-action )) do commands done
The value of variable is initially set to the integer value start, and commands are executed repeatedly, performing iteraction-action each time until condition is no longer true. Note that this loop is performed in the BASH Math context, and therefore condition is written with symbols such as <, >, <=, and >= instead of -lt, -gt, -le, and ge.
for ((x=0; x<=10; x++)) do echo $x done
case expression in pattern1[|pattern1b...]) commands1 ;; [pattern2[|pattern2b...]) commands2 ;; ...] esac
Executes the first group of commands for which the corresponding pattern(s) match the expression. The matching is done using globbing rules.
read x case "$x" in y*|Y*) echo "Interpreting that as 'yes'" ;; n*|N*) echo "Interpreting that as 'no'" ;; *) echo "did you mean yes or no?!" ;; esac