BASH: getopts with default parameters value

非 Y 不嫁゛ 提交于 2019-12-20 07:27:12

问题


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.


回答1:


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"



回答2:


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)



来源:https://stackoverflow.com/questions/21708565/bash-getopts-with-default-parameters-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!