Как получить доступ к параметрам командной строки вызывающей стороны в функции?

Я пытаюсь записать функцию в ударе, который получит доступ к параметрам командной строки сценариев, но они заменяются позиционными параметрами к функции. Есть ли какой-либо путь к функции для доступа к параметрам командной строки, если они не передаются в явно?

# Demo function
function stuff {
  echo $0 $*
}

# Echo's the name of the script, but no command line arguments
stuff

# Echo's everything I want, but trying to avoid
stuff $*
89
задан codeforester 13 March 2019 в 23:48
поделиться

5 ответов

Я читал справочное руководство по bash, в котором говорится, что этот материал записан в BASH_ARGV, хотя там много говорится о "стеке".

#!/bin/bash

function argv {
    for a in ${BASH_ARGV[*]} ; do
      echo -n "$a "
    done
    echo
}

function f {
    echo f $1 $2 $3
    echo -n f ; argv
}

function g {
    echo g $1 $2 $3
    echo -n g; argv
    f
}

f boo bar baz
g goo gar gaz

Сохранить в f.sh

$ ./f.sh arg0 arg1 arg2
f boo bar baz
farg2 arg1 arg0 
g goo gar gaz
garg2 arg1 arg0 
f
farg2 arg1 arg0 
43
ответ дан 24 November 2019 в 07:18
поделиться

Если вы хотите, чтобы ваши аргументы были в стиле C (массив аргументов + количество аргументов), вы можете использовать $ @ и $ # .

$ # дает вам количество аргументов.
$ @ дает вам все аргументы. Вы можете превратить это в массив с помощью args = ("$ @") .

Так, например:

args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}

Обратите внимание, что здесь $ {args [0]} на самом деле является 1-м аргументом, а не именем вашего скрипта.

87
ответ дан 24 November 2019 в 07:18
поделиться
#!/usr/bin/env bash

echo name of script is $0
echo first argument is $1
echo second argument is $2
echo seventeenth argument is $17
echo number of arguments is $#

Изменить: пожалуйста, посмотрите мой комментарий к вопросу

13
ответ дан 24 November 2019 в 07:18
поделиться

Комментарий Рави, по сути, является ответом. Функции принимают свои собственные аргументы. Если вы хотите, чтобы они были такими же, как аргументы командной строки, вы должны передать их. В противном случае вы явно вызываете функцию без аргументов.

При этом вы можете, если хотите, сохранить аргументы командной строки в глобальном массиве для использования в других функциях:

my_function() {
    echo "stored arguments:"
    for arg in "${commandline_args[@]}"; do
        echo "    $arg"
    done
}

commandline_args=("$@")

my_function

Вы должны получить доступ к аргументам командной строки через переменную commandline_args , не $ @ , $ 1 , $ 2 и т. д., но они доступны. Я не знаю, как назначить напрямую массиву аргументов, но если кто-то знает такой, пожалуйста, просветите меня!

Также обратите внимание на то, как я использовал и процитировал $ @ - так вы гарантируете, что специальные символы (пробелы) не испорчены.

15
ответ дан 24 November 2019 в 07:18
поделиться
# Save the script arguments
SCRIPT_NAME=$0
ARG_1=$1
ARGS_ALL=$*

function stuff {
  # use script args via the variables you saved
  # or the function args via $
  echo $0 $*
} 


# Call the function with arguments
stuff 1 2 3 4
6
ответ дан 24 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: