Подтвердить что ты не робот

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

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

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

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

# Echo everything I want, but trying to avoid
stuff $*
4b9b3361

Ответ 1

Мое чтение справочника 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 

Ответ 2

Если вы хотите иметь свой стиль аргументов C (массив аргументов + количество аргументов), вы можете использовать [email protected] и $#.

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

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

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

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

Ответ 3

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

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

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

commandline_args=("[email protected]")

my_function

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

Также обратите внимание на то, как я использовал и цитировал [email protected] - это то, как вы гарантируете, что специальные символы (пробелы) не будут удалены.

Ответ 4

#!/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 $#

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

Ответ 5

# 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

Можно сделать это так же

#!/bin/bash
# script_name function_test.sh
function argument(){
for i in [email protected];do
    echo $i
done;
}
argument [email protected]

Теперь вызовите script как

./function_test.sh argument1 argument2

Ответ 7

Вы можете использовать ключевое слово shift (operator?) для итерации через них. Пример:

#!/bin/bash
function print()
{
    while [ $# -gt 0 ]
    do
        echo $1;
        shift 1;
    done
}
print $*;