7

我正在尝试编写一个包装器外壳脚本,该脚本在每次调用命令时都会缓存信息。它只需要存储第一个非选项参数。例如,在

$ mycommand -o option1 -f another --spec more arg1 arg2

我想检索“arg1”。

如何在 bash 中做到这一点?

4

3 回答 3

9

使用getopt可能是要走的路。

如果你想在 bash 中查看参数扫描代码,非 getopt 方式是:

realargs="$@"
while [ $# -gt 0 ]; do
    case "$1" in
      -x | -y | -z)
        echo recognized one argument option $1 with arg $2
        shift
        ;;
      -a | -b | -c)
        echo recognized zero argument option $1, no extra shift
        ;;
      *)
        saveme=$1
        break 2
        ;;
    esac
    shift
done
set -- $realargs
echo saved word: $saveme
echo run real command: "$@"
于 2009-09-25T03:01:49.440 回答
3

如果不检查整个命令行,就无法挑选出任何特定的参数。这样做的原因是 bash 的基本假设,即任何选项都可以按任何顺序出现,而不考虑命令行上的相对位置。另一个前提是,在手册页中以短格式或长格式(即“-f”或“--file”)指定的任何选项在执行命令时都将具有有效的、公认的用途。

您最好的选择是使用 DigitalRoss 提供的示例,并为命令的每个有效选项的 case 语句编码一个值,或者只为您想要在脚本中处理的选项编码并捕获其他所有内容"*)" 构造,如果它属于该测试,则忽略它。诀窍是,如果一个特定选项有多个有效参数,您需要提前知道参数之间的区别是基于参数内容的位置匹配还是模式匹配。对于具有多个参数的选项,您还需要使用“skip”指令从一个参数移动到下一个参数。

于 2009-09-28T14:28:35.110 回答
2

您可能想要做一些事情getopt(查看此处此处了解如何使用)。

也许保存整个命令行(这样你就可以把它完整地交给真正的工具),然后用 处理参数getopt,获取你需要的信息,然后启动底层工具。

于 2009-09-25T02:24:14.540 回答