Отдельные аргументы «Source» и «Parent Script» в bash - PullRequest
1 голос
/ 15 октября 2019

У меня есть скрипт, который анализирует аргументы из родительского скрипта.

script1.sh

echo " script1 got $# args: $@"

script2.sh

source script1.sh
echo "script2 got $# args: $@"

Когда я его выполняю, яget:

$ 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 Ответ

1 голос
/ 15 октября 2019

Похоже, вам нужно использовать "$*" вместо "$@" при вызове 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 равно нулю, параметры объединяются без промежуточных разделителей. Тогда как "$@" эквивалентно "$1" "$2"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...