bash中单独的“源”参数和“父脚本”参数

时间:2019-10-15 15:55:19

标签: bash arguments

我有一个脚本,用于解析其父脚本中的参数。

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

1 个答案:

答案 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"