我正在编写一个bash脚本,它接受一些可选参数。我想翻译它们并将它们传递给另一个脚本。但是,我很难优雅地传递可选参数。
以下是我设法在伪代码中工作的概述:
a.sh:
if arg1 in arguments; then
firstArg="first argument"
fi
if arg2 in arguments; then
secondArg="second argument"
fi
./b.sh $firstArg $secondArg "default argument"
请注意参数中的空格。
b.sh:
for arg in "$@"
do
echo $arg
done
我想调用b.sh
,可选择firstArg
和secondArg
以及默认参数,如下所示:
./b.sh $firstArg $secondArg "default argument"
问题在于,如果$firstArg
或$secondArg
是带空格的字符串,它们将表示为多个参数,输出将类似于:
first
argument
second
argument
default argument
好的,这很容易修复,让我们通过在它周围添加引号来捕获整个参数字符串,如下所示:
./b.sh "$firstArg" "$secondArg" "defaultArg"
问题是,例如,如果未设置firstArg
,则会产生一个空行(因为它会将""
解释为参数),因此输出将类似于:
(blank line here)
second argument
defaultArg
我也尝试构造一个字符串并将其传递给shell脚本,但它似乎也没有那样工作(它将整个字符串解释为参数,即使我用参数添加参数) 。
请注意,使用引用的参数从命令行调用b.sh
可以正常工作。有没有办法模仿bash脚本中的工作原理?
答案 0 :(得分:7)
如果你真的想要复制给定的所有参数,但又添加一个:
# this works in any POSIX shell
./b.sh "$@" defaultArg
或者,要明确传递firstArg
和secondArg
,但前提是它们存在(请注意,设置为空值的计数为"现有"此处):
# this works in any POSIX shell
./b.sh ${firstArg+"$firstArg"} ${secondArg+"$secondArg"} defaultArg
如果您想将set-to-empty-value视为不存在:
# this works in any POSIX shell
./b.sh ${firstArg:+"$firstArg"} ${secondArg:+"$secondArg"} defaultArg
另一种方法是建立一个参数数组:
# this requires bash or another shell with arrays and append syntax
# be sure any script using this starts with #!/bin/bash
b_args=( )
[[ $firstArg ]] && b_args+=( "$firstArg" )
[[ $secondArg ]] && b_args+=( "$secondArg" )
b_args+=( "default argument" )
./b.sh "${b_args[@]}"
如果您想要与数组方法具有相同灵活性的东西,但没有兼容性问题,请定义一个函数;在其中,您可以安全地覆盖"$@"
而不会影响脚本的其余部分:
runB() {
set --
[ -n "$firstArg" ] && set -- "$@" "$firstArg"
[ -n "$secondArg" ] && set -- "$@" "$secondArg"
./b.sh "$@" "default argument"
}
答案 1 :(得分:1)
使用数组:
args=()
if [ ... ]; then
args+=( "first argument" )
fi
if [ ... ]; then
args+=( "second argument" )
fi
./b.sh "${args[@]}" "default argument"