The case statement is good alternative to multilevel if-then-else-fi statement. It enable you to match several values against one variable. It is easier to read and write.
Syntax
The syntax is as follows:
case $variable-name in
pattern1)
command1
...
....
commandN
;;
pattern2)
command1
...
....
commandN
;;
patternN)
command1
...
....
commandN
;;
*)
esac
case $variable-name in
pattern1|pattern2|pattern3)
command1
...
....
commandN
;;
pattern4|pattern5|pattern6)
command1
...
....
commandN
;;
pattern7|pattern8|patternN)
command1
...
....
commandN
;;
*)
esac
- The case statement allows you to easily check pattern (conditions) and then process a command-line if that condition evaluates to true.
- In other words the $variable-name is compared against the patterns until a match is found.
- *) acts as default and it is executed if no match is found.
- The pattern can include wildcards.
- You must include ;; at the end of each commandN. The shell executes all the statements up to the two semicolons that are next to each other.
- The esac is always required to indicate end of case statement.
Example
Create a shell script called rental.sh:
#!/bin/bash
# if no command line arg given
# set rental to Unknown
rental="*** Unknown vehicle ***"
# otherwise make first arg as a rental
rental=
# use case statement to make decision for rental
$rental
"car" "For $rental rental is Rs.20 per k/m."
"van" "For $rental rental is Rs.10 per k/m."
"jeep" "For $rental rental is Rs.5 per k/m."
"bicycle" "For $rental rental 20 paisa per k/m."
"enfield" "For $rental rental Rs.3 per k/m."
"thunderbird" "For $rental rental Rs.5 per k/m."
"Sorry, I can not get a $rental rental for you!"
Save and close the file. Run it as follows:
chmod +x rental.sh .rental.sh .rental.sh jeep .rental.sh enfield .rental.sh bike
Sample outputs:
Sorry, I can not get a *** Unknown vehicle *** rental for you! For jeep rental is Rs.5 per k/m. For enfield rental Rs.3 per k/m. Sorry, I can not get a bike rental for you!
The case statement first checks $rental against each option for a match. If it matches "car", the echo command will display rental for car. If it matches "van", the echo command will display rental for van and so on. If it matches nothing i.e. * (default option), an appropriate warning message is printed.
Using Multiple Patterns
#!/bin/bash =$ + Mon "Full backup" TueWedThuFri "Partial backup" SatSun "No backup"
The following shell script demonstrate the concept of command line parameters processing using the case statement (casecmdargs.sh):
#!/bin/bash
= # option
= # filename
# test -e and -E command line args matching
-E
"Editing $2 file..."
# make sure filename is passed else an error displayed
$FILE "File name missing"; ; $FILE
-C
"Displaying $2 file..."
$FILE "File name missing"; ; $FILE
-D
"Today is $(date)"
"Bad argument!"
"Usage: $0 -ecd filename"
" -e file : Edit file."
" -c file : Display file."
" -d : Display current date and time."
Run it as follows:
chmod +x casecmdargs.sh .casecmdargs.sh .casecmdargs.sh tmp .casecmdargs.sh tmp .casecmdargs.sh .casecmdargs.sh
Creating a backup script
Create a backup script called allinonebackup.sh:
#!/bin/bash
# A shell script to backup mysql, webserver and files to tape
=
sql
"Running mysql backup using mysqldump tool..."
"Running backup using rsync tool..."
"Running tape backup using tar tool..."
"Backup shell script utility"
"Usage: $0 {sql|sync|tar}"
" sql : Run mySQL backup utility."
" sync : Run web server backup utility."
" tar : Run tape backup utility."
Save and close the file. Run it as follows:
chmod +x allinonebackup.sh # run sql backup .allinonebackup.sh sql # Dump file system using tape device .allinonebackup.sh # however, the following will fail as patterns are case sensitive # you must use command line argument tar and not TAR, Tar, TaR etc. .allinonebackup.sh TAR
Inga kommentarer:
Skicka en kommentar