如何在复杂的脚本中指定使用说明?

时间:2016-12-26 00:01:54

标签: shell unix scripting conventions

我有一个脚本,可以通过3个主要步骤执行某些任务。每个步骤可能需要一些额外的参数,但根据选择的步骤,这些可能会有所不同。用户可以选择仅执行某些步骤,但不支持所有组合。我想告诉用户他们可以调用脚本的所有可能方式,但是要以简洁的方式进行。

我想到的唯一正确的方法(即使用正确的符号指定所有可能性)是明确地在不同的行中陈述所有变体:

./script -p [-d <arg>]
./script -u -d <arg>
./script -r -e <arg> -f <arg> -g|(-h <arg> -i <arg>)
./script -pu [-d <arg>]
./script -ur -d <arg> -e <arg> -f <arg> -g|(-h <arg> -i <arg>)
./script -pur [-d <arg>] -e <arg> -f <arg> -g|(-h <arg> -i <arg>)

但这相当冗长。更糟糕的是,如果我在脚本中添加另一个步骤,我将必须列出该步骤的所有组合。

我可以解决的另一种方法是简单地将所有参数列为可选(因为所有步骤都不是必需的参数),但这当然是不正确的(没有一个参数总是强制性的,但无论如何都是需要提供一些参数:

./script [-p] [-u] [-r] [-d <arg>] [-e <arg>] [-f <arg>] [-g|(-h <arg> -i <arg>)]
坦率地说,我不知道哪一个更糟糕。那你怎么建议我写我的用法笔记?并且,如果可能的话,请建议一个通用的方法,因为许多具有多个选项的脚本都会出现这些问题。

1 个答案:

答案 0 :(得分:2)

我从不喜欢那些漫长的使用线。虽然你可以说它们是必要的 它们并不是真正意义上的人类消费。我更喜欢这种风格 pacman documentation

SYNOPSIS
  pacman <operation> [options] [targets]

OPERATIONS
  -D, --database
    Operate on the package database.

  -Q, --query
    Query the package database.

OPTIONS
  -b, --dbpath <path>
    Specify an alternative database location (a typical default is
    /var/lib/pacman).

  -r, --root <path>
    Specify an alternative installation root (default is /).

EXAMPLES
  pacman -Ss ne.hack
    Search for regexp "ne.hack" in package database.

  pacman -S gpm
    Download and install gpm including dependencies.

或者,如果您想消除不同使用形式的歧义,您可以这样做 的coreutils:

SYNOPSIS
  ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
  ln [OPTION]... TARGET                  (2nd form)
  ln [OPTION]... TARGET... DIRECTORY     (3rd form)
  ln [OPTION]... -t DIRECTORY TARGET...  (4th form)

SYNOPSIS
  mv [OPTION]... [-T] SOURCE DEST
  mv [OPTION]... SOURCE... DIRECTORY
  mv [OPTION]... -t DIRECTORY SOURCE...

SYNOPSIS
  cp [OPTION]... [-T] SOURCE DEST
  cp [OPTION]... SOURCE... DIRECTORY
  cp [OPTION]... -t DIRECTORY SOURCE...