将命令行args传递给另一个脚本

时间:2016-10-14 16:28:43

标签: bash shell getopts

我有几个相互调用的脚本。但是,当我通过

来自buid-and-run-node.sh的片段

OPTIND=1 # Reset getopts in case it was changed in a previous run
while getopts "hn:c:f:s:" opt; do
    case "$opt" in
        h)
            usage
            exit 1
            ;;
        n)
            container_name=$OPTARG
            ;;
        c)
            test_command=$OPTARG
            ;;
        s)
            src=$OPTARG
            ;;
        *)
            usage
            exit 1
            ;;
    esac
done

$DIR/build-and-run.sh -n $container_name -c $test_command -s $src -f $DIR/../dockerfiles/dockerfile_node

build-and-run.sh的片段

OPTIND=1 # Reset getopts in case it was changed in a previous run
while getopts "hn:c:f:s:" opt; do
    case "$opt" in
        h)
            usage
            exit 1
            ;;
        n)
            container_name=$OPTARG
            ;;
        c)
            test_command=$OPTARG
            ;;
        f)
            dockerfile=$OPTARG
            ;;
        s)
            src=$OPTARG
            ;;
        *)
            usage
            exit 1
            ;;
    esac
done

我这样称呼

build-and-run-node.sh -n test-page-helper -s ./ -c 'scripts/npm-publish.sh -r test/test-helpers.git -b patch'

意图是npm-publish.sh应该使用-r和-b参数运行。但是,当我运行脚本时,我得到了

build-and-run.sh: illegal option -- r

这显然意味着它是使用-r的构建并运行命令。我该如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

你需要在buid-and-run-node.sh中的$test_command附近加双引号,否则该变量将在空格上分割,并且似乎包含buid-and-run.sh的参数。像这样:

$DIR/build-and-run.sh -n $container_name -c "$test_command" -s $src -f $DIR/../dockerfiles/dockerfile_node

更多信息

正如下面的评论正确指出的那样,在Bash中引用所有变量是一个好习惯,除非你知道你想要它们(例如,启用shell globbing)。至少在变量名称是较大单词的一部分的情况下,使用花括号来描述变量名称也很有帮助。这是为了防止以后的字符被视为变量名if they're legal的一部分。所以更好的命令调用可能如下:

"${DIR}/build-and-run.sh" -n "$container_name" -c "$test_command" -s "$src" -f "${DIR}/../dockerfiles/dockerfile_node"