我有几个相互调用的脚本。但是,当我通过
来自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的构建并运行命令。我该如何避免这种情况?
答案 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"