Я пытаюсь записать функцию в ударе, который получит доступ к параметрам командной строки сценариев, но они заменяются позиционными параметрами к функции. Есть ли какой-либо путь к функции для доступа к параметрам командной строки, если они не передаются в явно?
# 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, в котором говорится, что этот материал записан в 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
Если вы хотите, чтобы ваши аргументы были в стиле C (массив аргументов + количество аргументов), вы можете использовать $ @
и $ #
.
$ #
дает вам количество аргументов.
$ @
дает вам все аргументы. Вы можете превратить это в массив с помощью args = ("$ @")
.
Так, например:
args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}
Обратите внимание, что здесь $ {args [0]}
на самом деле является 1-м аргументом, а не именем вашего скрипта.
#!/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