我正在编写一个调用另一个脚本的非常简单的脚本,我需要将参数从当前脚本传播到我正在执行的脚本。
例如,我的脚本名为foo.sh,调用bar.sh。
foo.sh:
bar $1 $2 $3 $4
如何在不显式指定每个参数的情况下做到这一点?
我正在编写一个调用另一个脚本的非常简单的脚本,我需要将参数从当前脚本传播到我正在执行的脚本。
例如,我的脚本名为foo.sh,调用bar.sh。
foo.sh:
bar $1 $2 $3 $4
如何在不显式指定每个参数的情况下做到这一点?
当前回答
#!/usr/bin/env bash
while [ "$1" != "" ]; do
echo "Received: ${1}" && shift;
done;
只是认为在尝试测试args如何进入脚本时,这可能更有用
其他回答
Bar "$@"将等价于Bar "$1" "$2" "$3" "$4"
注意,引号很重要!
"$@", $@, "$*"或$*将在此stackoverflow回答中描述的转义和连接方面各自表现略有不同。
一个密切相关的用例是在一个参数中传递所有给定的参数,就像这样:
Bash -c“bar \”$1\“$2\”$3\“$4\””。
我使用@kvantour的答案的一个变体来实现这一点:
Bash -c "bar $(printf - ' ' %s ' ' ' $@")"
我的SUN Unix有很多限制,甚至“$@”也没有按预期解释。我的变通方法是${@}。例如,
#!/bin/ksh
find ./ -type f | xargs grep "${@}"
顺便说一下,我必须有这个特定的脚本,因为我的Unix也不支持grep -r
"${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'"
我知道这个问题已经得到了很好的回答,但这里有一个“$@”$@“$*”和$*之间的比较
测试脚本内容:
# cat ./test.sh
#!/usr/bin/env bash
echo "================================="
echo "Quoted DOLLAR-AT"
for ARG in "$@"; do
echo $ARG
done
echo "================================="
echo "NOT Quoted DOLLAR-AT"
for ARG in $@; do
echo $ARG
done
echo "================================="
echo "Quoted DOLLAR-STAR"
for ARG in "$*"; do
echo $ARG
done
echo "================================="
echo "NOT Quoted DOLLAR-STAR"
for ARG in $*; do
echo $ARG
done
echo "================================="
现在,运行带有各种参数的测试脚本:
# ./test.sh "arg with space one" "arg2" arg3
=================================
Quoted DOLLAR-AT
arg with space one
arg2
arg3
=================================
NOT Quoted DOLLAR-AT
arg
with
space
one
arg2
arg3
=================================
Quoted DOLLAR-STAR
arg with space one arg2 arg3
=================================
NOT Quoted DOLLAR-STAR
arg
with
space
one
arg2
arg3
=================================
工作正常,除非您有空格或转义字符。我没有找到在这种情况下捕获参数并发送到脚本中的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 '@' \' )