【问题标题】:Parse bash argument inside flag解析标志内的 bash 参数
【发布时间】:2020-03-09 13:47:30
【问题描述】:

我想在一个参数中做一个参数解析器。

这是我的启动器./bin/kube/launch_market_quality_job.sh -e staging -j job_example

这里是我的脚本。

while [ ${#} -ne 0 ]; do
  case "${1}" in
    --environment | -e)
      shift;
      export ONE_ENVIRON=${1};
      case $ONE_ENVIRON in
        staging)
          export REPOSITORY=<DTR>
          ;;
        production)
          export REPOSITORY=<DTR>
          ;;
        *)
          fail "You must provide the environment [staging|production]"
          ;;
      esac
      ;;
    --job | -j )
      shift;
      export JOB=${1}
      case $JOB in
          job_example_extra_args)
          case "${1}" in
          --name | -n )
          export $NAME=${1}
      [... extra args]
      ;;
    *)
      help
      exit
      ;;
  esac
  shift
done

我想要做的是取决于“--j | -job”选项,是解析另外两个选项,具体取决于作业是一个还是另一个。

例如,一个普通的作业,称为“job_example”,使用之前的启动器可以正常工作。

但如果我的工作是“job_example_extra_args”,我需要一个名为“name”的新参数。

`./bin/kube/launch_market_quality_job.sh -e staging -j job_example_extra_args --name "Jesus"`

我不知道正确的方法是什么,如果调用了这个'job_example_extra_args',我想正确获取标志,如果不包含它,脚本应该失败或停止。 我想在 --job 标志中添加标志选项,以便在我想要的工作时激活它。

【问题讨论】:

标签: bash parsing arguments


【解决方案1】:

我会捕获所有参数并在解析所有参数后执行检查,例如:

unset ONE_ENVIRON JOB NAME
while [ ${#} -ne 0 ]; do
  case "${1}" in
    --job | -j )
      shift;
      export JOB=${1}
      ;;
  case "${1}" in
    --name | -n )
      shift
      export NAME=${1}
      ;;
  esac
  shift
done

if [ "$JOB" = job_example_extra_args ] && [ -z "$NAME" ]; then
  fail "You must provide a name for this job"
fi

这样,用户在--job JOBNAME 参数之前或之后传递--name NAME 参数都没有关系。重要的是在某个时候已经给出了必要参数的完整列表。

如果--name 必须与job_example_extra_args 作业一起传递,您也可能会报告错误:

if [ "$JOB" != job_example_extra_args ] && [ -n "$NAME" ]; then
  fail "You must NOT provide a name for this job"
fi

附言。为了清楚起见,我没有显示--environment|-e*,但它们没有任何问题。

【讨论】:

    【解决方案2】:

    您可以通过在每个替代作业中插入一个完整的解析循环来将辅助参数解析嵌入到主要(“作业”)解析中。但这将很难维护,因为与工作相关的逻辑与工作实施脱节了。

    也许更好的解决方案是为每个作业创建一个参数解析器+启动器。由于您已经将解析的参数移开,您可以使用 . 命令获取适当的脚本。 (许多 shell 允许 source 作为 . 的同义词。)请注意,如果您没有在 . 命令中的文件名之后指定参数,则不会更改现有参数,因此您的未处理参数只会被传递通过。 (对于 Posix shell,. 甚至可能不接受文件名后面的参数。)

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 2013-05-11
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2021-12-03
      • 2016-01-11
      相关资源
      最近更新 更多