将命令行选项传递给bash中调用的脚本

时间:2013-09-23 17:27:39

标签: bash shell command-line-arguments

假设我有一个用选项

调用的脚本a.sh
a.sh -a1 a1option -a2 a2option

假设我还有一个脚本b.sh,它调用a.sh并使用自己的选项。因此用户按如下方式执行脚本:

b.sh -b1 b1option -b2 b2option -a1 a1option -a2 a2option

现在我想知道如何解析b.sh中的命令行选项。

我不需要解析整个命令行。我不希望b.sh知道选项a1a2。我想只获取选项b1b2,并将其余传递给a.sh

你会怎么做?

3 个答案:

答案 0 :(得分:4)

根据要求,此方法可避免解析整个命令行。仅为--收集了b.sh以前的参数。然后剥离b的参数,只将剩余的参数传递给a.sh

使用b.sh调用

b.sh -b b1option -B b2option -- -a1 a1option -a2 a2option。在此行中,双短划线--表示b.sh的选项结束。以下内容解析--之前的选项以供b.sh使用,然后从$@中删除b参数,以便您可以将其传递给a.sh而无需担心错误{ {1}}可能会给你。

a.sh

注意:此方法使用bash内置的getopts。 Getopts(与getopt相反,没有s)只采用单字符选项;因此,我使用while getopts ":b:B:" opt; do case $opt in b) B1=${OPTARG} ;; B) B2=${OPTARG} ;; esac done ## strips off the b options (which must be placed before the --) shift $(({OPTIND}-1)) a.sh "$@" b代替Bb1

我最喜欢的getopts参考。

答案 1 :(得分:2)

您可以这样做:

#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
    -b1)
        B1=true
        B1OPT=$2
        shift
        ;;
    -b2)
        B2=true
        B2OPT=$2
        shift
        ;;
    --)
        shift
        break
        ;;
    *)
        echo "Invalid option: $1"
        exit 1  ## Could be optional.
        ;;
    esac
    shift
done

bash a2.sh "$@"

请注意,您应该将变量$@置于双引号内,以防止在展开时进行单词拆分。

答案 2 :(得分:1)

如果a.sh可以忽略它不知道的选项,你只需调用b.sh所有选项就可以调用它:

a.sh "${@}"