Objective: When you need to write bash script, you need to follow certain steps, I've summarized some tips which I've been using for the past.
Parameter and print out script usage:
The first thing after #!/bin/sh line should be usage for your script, especially when your script needs the parameters:
if [ $# -eq 1 ];then echo "$0 username";exit 1;fi
note: your script requires username as command parameter, so above line will force you to give one parameter after the command.
Path definition:
You should export PATH variables first like this:
export PATH=/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
Common tips in the script:
- check command return code
if [ $? -ne 0 ];then
commands
exit
fi
- while loop to read each line from /path/to/file and process it
do
echo $line
done < /path/to/file
or while IFS=\| read left right
do
echo $left $right
done < /path/to/filename
# another method
i=1
LINES=`cat /path/to/file | wc -l`
while [ $i -le $LINES ]
do
iLINE=`sed -n $i'p' /path/to/file`
echo $iLINE
i=$[$i+1]
done
- specify return value
return 0
exit
else
return 2
exit
fi
- seq command usage in for loop
01 01 03 04 05 06 07 08 09 10
- Always use "bash -n scriptname" to verify if your script got any syntax error.
- check if the file size is 0
note: if the /path/to/file filesize is not zero, then run commands
- use mktemp and mkdtemp
# TMPFILE1=`mktemp`
# TMPDIR1=`mktempdir`
- how to let ls function as cd
note: how to let ccd function as cd;pwd;foo
alias foo=`echo testing builtin`
ccd () { builtin cd "$1";pwd;foo; }
so ccd /tmp command will cd to /tmp, then print current working directory and print string 'testing builtin'
common tips:
- batch rename file
ls *.txt | sed 's#\(.*\).txt#mv \1.txt \1.bat#' | sh
2. use bc to calculate from CLI
# echo "scale=2;34359730176/1024/1024/1024" | bc
31.99
# echo "ibase=10;obase=16;10" | bc
A
# echo "ibase=16;obase=A;A" | bc
10
3. force root user to run script
if [ "$(id -u)" != "0" ]; then
echo "Only root can run this script"
exit 1
fi