The main difference between sh -x and sh -v: o sh -v shows each statement before it is executed o sh -x shows the actual variable values after substitution o often sh -x gives more useful debugging information $ sh ./jot 2 5 2 3 4 5 $ sh -v ./jot 2 5 #! /bin/sh prog=$(basename $0) basename $0 [ $# -ne 2 ] && echo usage: $prog start finish && exit start=$1 end=$2 i=$start while [ $i -le $end ] do echo -n "$i " i=$(expr $i + 1) done 2 expr $i + 1 3 expr $i + 1 4 expr $i + 1 5 expr $i + 1 echo $ sh -x ./jot 2 5 ++ basename ./jot + prog=jot + '[' 2 -ne 2 ']' + start=2 + end=5 + i=2 + '[' 2 -le 5 ']' + echo -n '2 ' 2 ++ expr 2 + 1 + i=3 + '[' 3 -le 5 ']' + echo -n '3 ' 3 ++ expr 3 + 1 + i=4 + '[' 4 -le 5 ']' + echo -n '4 ' 4 ++ expr 4 + 1 + i=5 + '[' 5 -le 5 ']' + echo -n '5 ' 5 ++ expr 5 + 1 + i=6 + '[' 6 -le 5 ']' + echo