如何从getopts接受2个论点

时间:2019-09-04 18:49:09

标签: bash shell getopts

我正在创建一个bash脚本,该脚本将在命令行中从用户那里输入两个参数。但是我不确定如何从用户那里获取2个参数,如果没有传递两个参数都是必需的,则会显示错误并从脚本返回。下面是我用来从用户那里接受参数的代码,但是目前我的getopts仅接受一个参数。

optspec="h-:"
while getopts "$optspec" optchar; do
  case "${optchar}" in
    -)
      case "$OPTARG" in
        file)
          display_usage ;;
        file=*)
          INPUTFILE=${OPTARG#*=};;
      esac;;
    h|*) display_usage;;
  esac
done

我如何添加一个选项以从命令行中获取更多的args。像下面一样

script.sh --file="abc" --date="dd/mm/yyyy"

1 个答案:

答案 0 :(得分:1)

getopts不支持长参数。它仅支持单字母参数。

您可以使用getopt。它不像getopts那样广泛可用,getopt来自posix,处处可用。当然,linux-utils不仅可以在任何Linux上使用。在Linux上,它是mount的一部分,是一组最基本的实用程序,如swapongetopt

典型的if ! args=$(getopt -n "your_script_name" -oh -l file:,date: -- "$@"); then echo "Error parsing arguments" >&2 exit 1 fi # getopt parses `"$@"` arguments and generates a nice looking string # getopt .... -- arg1 --file=file arg2 --date=date arg3 # would output: # --file file --date date -- arg1 arg2 arg3 # the idea is to re-read bash arguments using `eval set` eval set -- "$args" while (($#)); do case "$1" in -h) echo "help"; exit; ;; --file) file="$2"; shift; ;; --date) date="$2"; shift; ;; --) shift; break; ;; *) echo "Internal error - programmer made an error with this while or case" >&2; exit 1; ;; esac shift done echo file="$file" date="$date" echo Rest of arguments: "$@" 用法如下:

* 10