Я пытаюсь найти способ передачи параметров в функции Bash, но всегда возникает вопрос о том, как передать параметр из командной строки.
Я хотел бы передать параметры в моем скрипте. Я старался:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Но синтаксис не правильный, как передать параметр моей функции?
bash
parameters
arguments
stivlo
источник
источник
Ответы:
Есть два типичных способа объявления функции. Я предпочитаю второй подход.
или
Чтобы вызвать функцию с аргументами:
Функция ссылается на переданные аргументы по их позиции (не по имени), то есть $ 1, $ 2 и т. Д. $ 0 - это имя самого скрипта.
Пример:
Кроме того, вам нужно вызывать вашу функцию после того, как она объявлена.
Вывод:
Ссылка: Расширенное руководство по написанию сценариев .
источник
function name() {}
. Может быть, с «войти» раньше{}
function
ключевое слово и()
. Моя цель (в файле, а не в командной строке) - повысить ясность, а не уменьшить количество набираемых символов, а именноfunction myBackupFunction() compound-statement
.function
версия ключевого слова является расширением; другая форма работает во всех POSIX-совместимых оболочках.function
в старых оболочках семейства ksh, которые ввели это ключевое слово, были гарантии того, что современный bash не соблюдает (в таких оболочкахfunction
переменные локальные по умолчанию; в bash , Это не). Таким образом, его использование снижает ясность для любого, кто знает и может ожидать поведения ksh. См. Wiki.bash-hackers.org/scripting/obsoleteЗнание языков программирования высокого уровня (C / C ++ / Java / PHP / Python / Perl ...) подсказывает непрофессионалу, что функции bash должны работать так же, как и в других языках. Вместо этого функции bash работают подобно командам оболочки и ожидают, что аргументы будут переданы им таким же образом, как можно передать параметр команде оболочки (например
ls -l
). По сути, аргументы функции в bash обрабатываются как позиционные параметры ($1, $2..$9, ${10}, ${11}
и т. Д.). Это не удивительно, учитывая, какgetopts
работает. Не используйте скобки для вызова функции в bash.( Примечание : в данный момент я работаю над Open Solaris.)
Хотите использовать имена для переменных. Просто сделай это.
Хотите передать массив в функцию?
Внутри функции обработайте аргументы следующим образом.
Нужно передать значение и массив, но все еще использовать «$ @» внутри функции?
источник
Если вы предпочитаете именованные параметры, возможно (с некоторыми хитростями) фактически передать именованные параметры функциям (также позволяет передавать массивы и ссылки).
Метод, который я разработал, позволяет вам определять именованные параметры, передаваемые функции следующим образом:
Вы также можете аннотировать аргументы как @required или @readonly, создавать аргументы ... rest, создавать массивы из последовательных аргументов (используя, например
string[4]
) и, необязательно, перечислять аргументы в несколько строк:Другими словами, вы можете не только вызывать ваши параметры по их именам (что делает ядро более читабельным), вы также можете передавать массивы (и ссылки на переменные - хотя эта функция работает только в bash 4.3)! Кроме того, все отображаемые переменные находятся в локальной области, как и 1 доллар (и другие).
Код, который делает эту работу довольно легким и работает как в bash 3, так и в bash 4 (это единственные версии, с которыми я его тестировал). Если вас интересуют другие подобные хитрости, которые делают разработку с помощью Bash намного приятнее и проще, вы можете взглянуть на мою Bash Infinity Framework , код ниже доступен в качестве одной из ее функциональных возможностей.
источник
@var
,@reference
,@params
переменные? Что я должен искать в Интернете, чтобы узнать больше об этом?ucommon
и моим кодом. Возможно, у вас установлен какой-то инструмент, вызывающий упомянутую вами проблему, не знаю, что это может быть.Пропустите скобки и запятые:
и функция должна выглядеть так:
источник
Я надеюсь, что этот пример может помочь вам. Он берет два числа от пользователя, передает их в вызываемую функцию
add
(в самой последней строке кода),add
суммирует их и распечатывает.источник
Простой пример, который будет очищен как во время выполнения скрипта, так и внутри скрипта при вызове функции.
источник
Я подумал, что я расскажу о другом способе передачи именованных параметров в bash ... по ссылке. Это поддерживается начиная с Bash 4.0
Альтернативный синтаксис для bash 4.3 - использование nameref
Хотя nameref намного удобнее в том смысле, что оно легко разыменовывается, некоторые старые поддерживаемые дистрибутивы все еще поставляют более старую версию, поэтому я пока не буду рекомендовать ее.
источник