If testing reveals a problem the next step is debugging.
-
Isolate
Isolate the problem area by commenting out sections of code
``` bash if [[ -d $dir_name ]]; then if cd $dir_name; then rm * else echo "cannot cd to '$dir_name'" >&2 exit 1 fi
else#
echo "no such directory: '$dir_name'" >&2#
exit 1#
fi ```
-
Tracing
Tracing by placing informative messages in the script
bash echo "preparing to delete files" >&2 if [[ -d $dir_name ]]; then if cd $dir_name; then echo "deleting files" >&2 rm * else echo "cannot cd to '$dir_name'" >&2 exit 1 fi else echo "no such directory: '$dir_name'" >&2 exit 1 fi echo "file deletion complete" >&2
Send messages to standard error to separate them from normal output. Don't indent so easier to find when time to remove.
Implement tracing by the -x options and the set command with the -x option.
``` bash
!/bin/bash -x#
trouble: script to demonstrate common errors#
number=1 if [ $number = 1 ]; then echo "Number is equal to 1." else echo "Number is not equal to 1." fi ```
example
bash [me@linuxbox ~]$ trouble + number=1 + '[' 1 = 1 ']' + echo 'Number is equal to 1.' Number is equal to 1.
The + is the default char for trace output, contained in the PS4 shell variable.
-
You can change the PS4 variable to print line numbers
bash [me@linuxbox ~]$ export PS4='$LINENO + ' [me@linuxbox ~]$ trouble 5 + number=1 7 + '[' 1 = 1 ']' 8 + echo 'Number is equal to 1.' Number is equal to 1.
-
-
Examine values during execution
Echo variables to see internal workings during execution
bash echo "number=$number" # DEBUG set -x # Turn on tracing if [ $number = 1 ]; then echo "Number is equal to 1." else echo "Number is not equal to 1." fi set +x # Turn off tracing