我正在编写一个调用另一个脚本的非常简单的脚本,我需要将参数从当前脚本传播到我正在执行的脚本。

例如,我的脚本名为foo.sh,调用bar.sh。

foo.sh:

bar $1 $2 $3 $4

如何在不显式指定每个参数的情况下做到这一点?


当前回答

bash和其他类似bourne的炮弹:

bar "$@"

其他回答

工作正常,除非您有空格或转义字符。我没有找到在这种情况下捕获参数并发送到脚本中的ssh的方法。

这可能是有用的,但如此丑陋

_command_opts=$( echo "$@" | awk -F\- 'BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }' | tr '@' \' )

"${array[@]}"是在bash中传递任何数组的正确方式。我想提供一个完整的备忘单:如何准备参数,绕过和处理它们。

Pre.sh -> foo.sh -> bar.sh。

#!/bin/bash

args=("--a=b c" "--e=f g")
args+=("--q=w e" "--a=s \"'d'\"")

./foo.sh "${args[@]}"
#!/bin/bash

./bar.sh "$@"
#!/bin/bash

echo $1
echo $2
echo $3
echo $4

结果:

--a=b c
--e=f g
--q=w e
--a=s "'d'"

我的SUN Unix有很多限制,甚至“$@”也没有按预期解释。我的变通方法是${@}。例如,

#!/bin/ksh
find ./ -type f | xargs grep "${@}"

顺便说一下,我必须有这个特定的脚本,因为我的Unix也不支持grep -r

bash和其他类似bourne的炮弹:

bar "$@"

有时你想传递所有的参数,但前面有一个标志(例如——flag)

$ bar --flag "$1" --flag "$2" --flag "$3"

你可以通过以下方式做到这一点:

$ bar $(printf -- ' --flag "%s"' "$@")

注意:为了避免额外的字段分割,您必须引用%s和$@,并且为了避免使用单个字符串,您不能引用printf的子shell。