BASH: getopts with default parameters value

2020-05-08 18:40发布

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)
    fold=/dev
    dir=${2:-fold}

     a=`find $dir -type b | wc -l`
     echo "$a"
  ;;
esac
done

I calling it by:

  ./sc.sh -r /bin

and it's work, but when I don't give a parameter it doesn't work:

  ./sc.sh -r

I want /dev to be my default parameter $2 in this script.

2条回答
贼婆χ
2楼-- · 2020-05-08 19:11

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)

查看更多
霸刀☆藐视天下
3楼-- · 2020-05-08 19:14

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"
查看更多
登录 后发表回答