我有一个脚本,用于解析其父脚本中的参数。
script1.sh
echo " script1 got $# args: $@"
script2.sh
source script1.sh
echo "script2 got $# args: $@"
当我执行它时,我得到:
$ bash script2.sh 1 2 cat
Script1 got 3 args: 1 2 cat
Script2 got 3 args: 1 2 cat
但是,我想更改script2.sh以允许script1.sh接收自己的参数。
NewScript2.sh
source script1.sh arg1
echo "script2 got $# args: $@"
现在我得到
$ bash script2.sh 1 2 cat
Script1 got 1 args: arg1
Script2 got 3 args: 1 2 cat
我可以修复它,因此我可以通过将script2更改为
来获得两个参数source script1.sh "$@" arg1
echo "script2 got $# args: $@"
我的问题是如何更改script1以区分从script1和script2收到的参数?
无论我对$@
做些什么(引号,斜杠等),它仍然告诉我我有4个参数。我对待输入参数的方式也一样。
示例:
$ bash script2.sh 1 2 cat
Script1 got 4 args: arg1 1 2 cat
Script2 got 3 args: 1 2 cat
$ bash script2.sh "1 2 cat"
Script1 got 4 args: arg1 1 2 cat
Script2 got 1 args: 1 2 cat
答案 0 :(得分:1)
看起来,当您使用参数调用"$*"
时,您需要使用"$@"
而不是script1.sh
cat script2.sh
source script1.sh "$*" arg1
echo "script2 got $# args: $@"
然后使用:
bash script2.sh 1 2 cat
script1 got 2 args: 1 2 cat arg1
script2 got 3 args: 1 2 cat
根据man bash
:
"$*"
等效于"$1c$2c..."
,其中c
是IFS
变量的值。如果未设置IFS
,则参数之间用空格分隔。如果IFS
为null,则将在不插入分隔符的情况下联接参数。
而"$@"
等效于"$1" "$2"