首页 > 解决方案 > 如何在 Mac OS 上运行需要 7 个可选参数和 5 个 COMPULSARY 参数的脚本?

问题描述

如何使用 5 个强制参数和 7 个可选参数运行我的脚本。例如:

$ myscript -k "path" -o "somenumber" -n "path" -o "path" <noarg> "path" 

这是必须的。脚本这样运行就好了。将得到结果。

但是,如果我想使用可选的运行它,例如:

$ myscript -e -k "path" -o "somenumber" -m "path" -o "path" <noarg> "path" -n "someword" -b "someIDLike abc.lpk.pou" -x "number"

参数 -e、-m、-b 和 -x 是可选的。我该怎么做呢?请帮忙。谢谢。

标签: bashargumentsparameter-passingoptional-arguments

解决方案


在 bash 中解析命令行参数的典型方法是使用内置命令getopts。Bash 将脚本的参数视为位置,并按从左到右的升序对它们进行编号,还有另一个命令可以很容易地系统地移动它们:shift. 通常是构造参数解析代码是组合getoptsshift在一个while循环中,像这样:

while getopts 'lhp:' OPTION; do
  case "$OPTION" in
    l)
      long=1
      ;;

    h)
      echo "you need some help" >&2
      echo "Try this: $(basename $0) [-l] [-h] [-p my_val]" >&2
      ;;

    p)
      p_val="$OPTARG"
      ;;
    ?)
      echo "ummmm..." >&2
      exit 1
      ;;
  esac
done
shift "$(($OPTIND-1))"

是一个很好的概述。

从手册页:

getopts:getopts 选择字符串名称 [arg]

外壳程序使用 Getopts 来解析位置参数。

OPTSTRING 包含要识别的选项字母;如果一个字母后跟一个冒号,则该选项应该有一个参数,它应该用空格与它分开。

每次调用getopts都会将下一个选项放入shell变量$name中,如果name不存在则初始化name,下一个要处理的参数的索引放入shell变量OPTIND中。每次调用 shell 或 shell 脚本时,都会将 OPTIND 初始化为 1。当一个选项需要一个参数时,getopts 将该参数放入 shell 变量 OPTARG。

要强制执行某些参数是强制性的规则,请在循环后添加一些额外的逻辑以验证是否实际提供了所有必需的参数。例如,在上面,我们可以说这l是强制性的,并像这样检查它:

if [ -z $long ]; then
  echo "you didn't provide 'l'"
  exit 1
fi

-z切换到命令将[产生 true 的参数是一个空字符串,如果参数是非空的,则返回 false。


推荐阅读