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



我正在编写一个带有一些可选参数的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

我想与firstArgsecondArg一起使用b.sh,以及类似默认的参数:

./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脚本中的工作方式?

如果您想复制给出的所有参数,但请添加一个:

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

或者,要明确传递firstArgsecondArg,但仅当它们存在时(请注意,设置为" empty-value"在此处算作"现有"):

# 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"
}

使用数组:

args=()
if [ ... ]; then
    args+=( "first argument" )
fi
if [ ... ]; then
    args+=( "second argument" )
fi
./b.sh "${args[@]}" "default argument"

相关内容

  • 没有找到相关文章

最新更新