I\'ve got another bash-script problem I simply couldn\'t solve. It\'s my simplified script showing the problem:
while getopts \"r:\" opt; do
case $opt in
r)
This works for me:
#!/bin/bash
while getopts "r" opt; do
case $opt in
r)
fold=/dev
dir=${2:-$fold}
echo "asdasd"
;;
esac
done
Remove the colon (:
) in the getopts argument. This caused getopt to expect an argument. (see here for more information about getopt)
There may be other parameters before, don't hard-code the parameter number ($2).
The getopts help says
When an option requires an argument, getopts places that argument into the shell variable OPTARG.
...
[In silent error reporting mode,] if a required argument is not found, getopts places a ':' into NAME and sets OPTARG to the option character found.
So you want:
dir=/dev # the default value
while getopts ":r:" opt; do # note the leading colon
case $opt in
r) dir=${OPTARG} ;;
:) if [[ $OPTARG == "r" ]]; then
# -r with required argument missing.
# we already have a default "dir" value, so ignore this error
:
fi
;;
esac
done
shift $((OPTIND-1))
a=$(find "$dir" -type b | wc -l)
echo "$a"