Advanced Bash-Scripting HOWTO: A guide to shell scripting, using Bash | ||
---|---|---|
Prev | Chapter 3. Tutorial / Reference | Next |
The "and list" and "or list" constructs provide a means of processing a number of commands consecutively. These can effectively replace complex nested if/then or even case statements. Note that the exit status of an "and list" or an "or list" is the exit status of the last command executed.
1 command-1 && command-2 && command-3 && ... command-n |
Example 3-87. Using an "and list" to test for command-line arguments
1 #!/bin/bash 2 3 # "and list" 4 5 if [ ! -z $1 ] && echo "Argument #1 = $1" && [ ! -z $2 ] && echo "Argument #2 = $2" 6 then 7 echo "At least 2 arguments to script." 8 # All the chained commands return true. 9 else 10 echo "Less than 2 arguments to script." 11 # At least one of the chained commands returns false. 12 fi 13 # Note that "if [ ! -z $1 ]" works, but its supposed equivalent, 14 # "if [ -n $1 ]" does not. This is a bug, not a feature. 15 16 17 # This accomplishes the same thing, coded using "pure" if/then statements. 18 if [ ! -z $1 ] 19 then 20 echo "Argument #1 = $1" 21 fi 22 if [ ! -z $2 ] 23 then 24 echo "Argument #2 = $2" 25 echo "At least 2 arguments to script." 26 else 27 echo "Less than 2 arguments to script." 28 fi 29 # It's longer and less elegant than using an "and list". 30 31 32 exit 0 |
1 command-1 || command-2 || command-3 || ... command-n |
Example 3-88. Using "or lists" in combination with an "and list"
1 #!/bin/bash 2 3 # "Delete", not-so-cunning file deletion utility. 4 # Usage: delete filename 5 6 if [ -z $1 ] 7 then 8 file=nothing 9 else 10 file=$1 11 fi 12 # Fetch file name (or "nothing") for deletion message. 13 14 15 [ ! -f $1 ] && echo "$1 not found. Can't delete a nonexistent file." 16 # AND LIST, to give error message if file not present. 17 18 [ ! -f $1 ] || ( rm -f $1; echo "$file deleted." ) 19 # OR LIST, to delete file if present. 20 # ( command1 ; command2 ) is, in effect, an AND LIST variant. 21 22 # Note logic inversion above. 23 # AND LIST executes on true, OR LIST on false. 24 25 [ ! -z $1 ] || echo "Usage: `basename $0` filename" 26 # OR LIST, to give error message if no command line arg (file name). 27 28 exit 0 |
Clever combinations of "and" and "or" lists are possible, but the logic may easily become convoluted and require extensive debugging.