If you’re like me (and God help you if you are) You write a lot of bash scripts… When something comes up bash is a VERY handy language to use because it’s a) portable (between almost all *nixes), b) lightweight, and c) flexible (thanks to the plethora of linux commands which can be piped together) One large reason people prefer perl (or some other language) is because they’re more flexible. And one of those cases is processing command line switches. Commonly bash scripts are coded in a way which makes it necessary to give certain switches as a certain argument to the script. This makes the script brittle, and you CANNOT leave out switch $2 if you plan to use switch $3. Allow me to help you get around this rather nasty little inconvenience! (note: this deals with SWITHCES ONLY! *NOT* switches with arguments!)
check_c_arg() {
count=0
for i in $@
do
if [ $count -eq 0 ]
then
count=1
else
if [ "$i" = "$1" ]
then
return 1
fi
fi
done
return 0
}
This beautiful little bit of code will allow you to take switches in ANY order. Simply setup a script like this:
#!/bin/bash
host="$1"
check_c_arg() {
count=0
for i in $@
do
if [ $count -eq 0 ]
then
count=1
else
if [ "$i" = "$1" ]
then
return 1
fi
fi
done
return 0
}
check_c_arg "-v" $@
cfg_verbose=$?
check_c_arg "-d" $@
cfg_dry_run=$?
check_c_arg "-h" $@
cfg_help=$?
if [ $cfg_help -eq 1 ]
then
echo -e "Usage: $0 [-v] [-h]"
echo -e "\t-v\tVerbose Mode"
echo -e "\t-d\tDry run (echo command, do not run it)"
echo -e "\t-h\tPrint this help message"
exit 1
fi
if [ $cfg_dry_run -eq 1 ]
then
echo "ping -c 4 $host"
else
if [ $cfg_verbose -eq 1 ]
then
ping -c 4 $host
else
ping -c 4 $host 1>/dev/null 2>/dev/null
fi
fi
In the above all of the following are valid:
- 127.0.0.1 -v -d
- 127.0.0.1 -d -v
- 127.0.0.1 -v
- 127.0.0.1 -d
- 127.0.0.1 -h
- 127.0.0.1 -h -v -d
- 127.0.0.1 -h -d -v
- 127.0.0.1 -h -v
- 127.0.0.1 -h -d
- 127.0.0.1 -v -h -d
- 127.0.0.1 -d -h -v
- 127.0.0.1 -v -h
- 127.0.0.1 -d -h
- 127.0.0.1 -v -d -h
- 127.0.0.1 -d -v -h
I hope this helps inspire people to take the easy (and often times more correct) path when faced with a problem which requires a solution, but not necessarily a terribly complex one.
Cheers!
DK