Я пытаюсь написать функцию в 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 $*
Ответ 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 (массив аргументов + количество аргументов), вы можете использовать $@
и $#
.
$#
дает вам количество аргументов.
$@
дает вам все аргументы. Вы можете превратить это в массив с помощью args=("$@")
.
Так, например:
args=("$@")
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=("$@")
my_function
Вам нужно получить доступ к аргументам командной строки с помощью переменной commandline_args
, а не $@
, $1
, $2
и т.д., но они доступны. Я не знаю, как назначить напрямую массив аргументов, но если кто-то знает его, пожалуйста, просветите меня!
Также обратите внимание на то, как я использовал и цитировал $@
- это то, как вы гарантируете, что специальные символы (пробелы) не будут удалены.
Ответ 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 $@;do
echo $i
done;
}
argument $@
Теперь вызовите script как
./function_test.sh argument1 argument2
Ответ 7
Вы можете использовать ключевое слово shift (operator?) для итерации через них.
Пример:
#!/bin/bash
function print()
{
while [ $# -gt 0 ]
do
echo $1;
shift 1;
done
}
print $*;