如何将可选参数传递给 bash 脚本中的另一个命令?

2024-01-03

我正在编写一个 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 and secondArg和一个像这样的默认参数:

./b.sh $firstArg $secondArg "default argument"

这样做的问题是,如果$firstArg or $secondArg是带有空格的字符串,它们将表示为多个参数,输出将类似于:

first
argument
second
argument
default argument

好的,这很容易解决,让我们通过在参数周围添加引号来捕获整个参数字符串,如下所示:

./b.sh "$firstArg" "$secondArg" "defaultArg"

问题是,例如,firstArg未设置,它会导致一个空行(因为它会解释""作为参数),因此输出将类似于:

(blank line here)
second argument
defaultArg

我还尝试过构造一个字符串并将其传递给 shell 脚本,但它似乎也不是这样工作的(它将整个字符串解释为参数,即使我用引号将参数分开)。

请注意,调用b.sh从我的命令行中引用的参数工作得很好。有没有办法在 bash 脚本中模拟它的工作原理?


如果您确实想复制给定的所有参数,但再添加一个:

# this works in any POSIX shell
./b.sh "$@" defaultArg

或者,显式传递firstArg and secondArg,但前提是它们存在(请注意,此处设置为空值算作“现有”):

# this works in any POSIX shell
./b.sh ${firstArg+"$firstArg"} ${secondArg+"$secondArg"} defaultArg

如果您想将设置为空值视为不存在:

# 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"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将可选参数传递给 bash 脚本中的另一个命令? 的相关文章

随机推荐