Я пытаюсь написать функцию в bash, которая будет обращаться к аргументам командной строки сценария, но они заменяются позиционными аргументами функции. Есть ли способ для функции получить доступ к аргументам командной строки, если они не переданы явно?
# 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 $*
bash
command-line-arguments
argv
ДонГар
источник
источник
$*
очень глючит - он изменится./yourScript "first argument" "second argument"
на./yourscript "first" "argument" "second" "argument"
или изменится./yourscript '*.txt'
на что-то вроде,./yourscript one.txt two.txt
несмотря на кавычки.Ответы:
Я читал руководство по bash ref, в котором говорится, что все это записано в 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
источник
Если вы хотите, чтобы ваши аргументы были в стиле C (массив аргументов + количество аргументов), вы можете использовать
$@
и$#
.$#
дает вам количество аргументов.$@
дает вам все аргументы. Вы можете превратить это в массив с помощьюargs=("$@")
.Так например:
args=("$@") echo $# arguments passed echo ${args[0]} ${args[1]} ${args[2]}
Обратите внимание, что здесь
${args[0]}
фактически находится 1-й аргумент, а не имя вашего скрипта.источник
args
массив изнутри функции, если вы инициализируете его заранее, как описано.echo "${args[0]} ${args[1]} ${args[2]}"
, или аргументы подлежат расширению имени файла.#!/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 $#
Изменить: пожалуйста, посмотрите мой комментарий к вопросу
источник
Комментарий Рави - это, по сути, ответ. Функции принимают свои собственные аргументы. Если вы хотите, чтобы они были такими же, как аргументы командной строки, вы должны передать их. В противном случае вы явно вызываете функцию без аргументов.
Тем не менее, вы можете, если хотите, сохранить аргументы командной строки в глобальном массиве для использования в других функциях:
my_function() { echo "stored arguments:" for arg in "${commandline_args[@]}"; do echo " $arg" done } commandline_args=("$@") my_function
Вы должны получить доступ к аргументам командной строки с помощью
commandline_args
переменной, а не$@
,$1
,$2
и т.д., но они доступны. Я не знаю, как назначить напрямую массиву аргументов, но если кто-то знает такой, пожалуйста, просветите меня!Также обратите внимание на то, как я использовал и цитировал
$@
- это то, как вы гарантируете, что специальные символы (пробелы) не испорчены.источник
# 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
источник
Можно и так
#!/bin/bash # script_name function_test.sh function argument(){ for i in $@;do echo $i done; } argument $@
Теперь назовите свой сценарий как
источник
function print() {
представляет собой смесь двух различных форм объявления функций -function print {
это унаследованный синтаксис ksh, который bash поддерживает для обратной совместимости с ksh до POSIX (то есть до 1991 года), иprint() {
, который стандартизирован для POSIX. Рассмотрите возможность использования того или другого для более широкой совместимости с другими оболочками; см. также wiki.bash-hackers.org/scripting/obsoleteВы можете использовать ключевое слово shift (оператор?), Чтобы перебирать их. Пример:
#!/bin/bash function print() { while [ $# -gt 0 ] do echo $1; shift 1; done } print $*;
источник
function print() {
представляет собой смесь двух различных форм объявления функций -function print {
это унаследованный синтаксис ksh, который bash поддерживает для обратной совместимости с ksh до POSIX (то есть до 1991 года), иprint() {
, который стандартизирован для POSIX. Рассмотрите возможность использования того или другого для более широкой совместимости с другими оболочками; см. также wiki.bash-hackers.org/scripting/obsoleteМое решение:
Создайте сценарий функции, который вызывается раньше, чем все другие функции, без передачи ему аргументов, например:
После этого вы можете вызвать init и использовать ORIGOPT var по мере необходимости, в качестве плюса я всегда назначаю новую var и копирую содержимое ORIGOPT в свои новые функции, так что вы можете быть уверены, что никто не коснется его или Измени это.
Я добавил пробелы и дефисы, чтобы упростить анализ с помощью sed -E, также bash не будет передавать его как ссылку и заставит ORIGOPT расти, поскольку функции вызываются с большим количеством аргументов.
источник