Difference between revisions of "BASH Flow Control"
Chris Tyler (talk | contribs) |
(→if) |
||
(One intermediate revision by one other user not shown) | |||
Line 32: | Line 32: | ||
echo -n "Are you sure you wish to remove '$file'?" | echo -n "Are you sure you wish to remove '$file'?" | ||
− | + | read YN | |
if [ "$YN" = "y" -o "$YN" = "Y" ] | if [ "$YN" = "y" -o "$YN" = "Y" ] | ||
then | then | ||
Line 57: | Line 57: | ||
Executes ''commands'' once for each time that ''pipeline'' returns a true result (exit code of zero). Example: | 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 (list) = | = for (list) = |
Latest revision as of 12:53, 21 September 2008
BASH provides a number of flow control constructs.
Contents
if
Format:
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.
Examples:
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
Format:
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 (list)
for variable in list do commands done
Examples:
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
for (numeric)
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.
Example:
for ((x=0; x<=10; x++)) do echo $x done
case
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.
Example:
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