while getopts "hd:R:" arg; do
  case $arg in
    h)
      echo "usgae"
      ;;
    d)
      dir=$OPTARG
      ;;
    R)
      if [[ $OPTARG =~ ^[0-9]+$ ]];then
        level=$OPTARG
      else
        level=1
      fi
      ;;
    \?)
      echo "WRONG" >&2
      ;;
  esac
done
  • 级别指的是-R的参数,dir指的是-d的参数
  • 当我输入./count.sh -R 1 -d test/时,它正确工作
  • 当我输入./count.sh -d test/ -R 1时,它正确工作
  • ,但是当我输入./count.sh -d test/ -R./count.sh -R -d test/
  • 时我想使其工作

    这意味着我希望-R具有默认值,并且命令顺序可以更灵活。

    最佳答案

    getopts并不真正支持此功能。但是编写自己的替代品并不难。

    while true; do
        case $1 in
          -R) level=1
                shift
                case $1 in
                  *[!0-9]* | "") ;;
                  *) level=$1; shift ;;
                esac ;;
            # ... Other options ...
            -*) echo "$0: Unrecognized option $1" >&2
                exit 2;;
            *) break ;;
        esac
    done
    

    07-28 03:04
    查看更多