检索第一个非选项命令行参数

时间:2009-09-25 02:18:08

标签: bash shell wrapper

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

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

我想检索“arg1。”

如何在bash中完成?

3 个答案:

答案 0 :(得分: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: "$@"

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

您可能希望使用getopt执行某些操作(查看herehere了解如何使用)。

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