Если задать для getopts несколько параметров но при вызове пропустить значения, то для для предыдущего параметра значением будет название следующего:
$ cat bin/testbash.sh
#!/bin/bash
#
aaa=
bbb=
ccc=
ddd=
while getopts ":a:b:c:d:" scriptopt
do
case "${scriptopt}" in
a)
aaa="${OPTARG}"
;;
b)
bbb="${OPTARG}"
;;
c)
ccc="${OPTARG}"
;;
d)
ddd="${OPTARG}"
;;
:)
echo "Error"
exit 1
;;
esac
done
echo "
${aaa}
${bbb}
${ccc}
${ddd}
"
$ testbash.sh -a 111 -b 222 -c 333 -d 444
111
222
333
444
$ testbash.sh -a 111 -b 222 -c
Error
$ testbash.sh -a 111 -b 222 -c -d
111
222
-d
$
В принципе это не смертельно, но может я просто чего не понимаю?