Передача параметрів у Bash-функцію

Я намагаюся шукати, як передати параметри в Bash-функції, але завжди вискакує, як передати параметр з командного рядка.

Я хотів би передати параметри всередині свого скрипта. Я спробував:

myBackupFunction("..", "...", "xx")

function myBackupFunction($directory, $options, $rootPassword) {
     ...
}

Але синтаксис не правильний, як передати параметр в мою функцію?

Рішення

Існує два типових способи оголошення функції. Я віддаю перевагу другому підходу.

function function_name {
   command...
} 

або

function_name () {
   command...
} 

Для виклику функції з аргументами:

function_name "$arg1" "$arg2"

Функція звертається до переданих аргументів за їх позицією (а не за іменами), тобто $1, $2 і так далі. $0 - ім'я самого скрипта.

Приклад:

function_name () {
   echo "Parameter #1 is $1"
}

Також потрібно викликати функцію після її оголошення.

#!/usr/bin/env sh

foo 1  # this will fail because foo has not been declared yet.

foo() {
    echo "Parameter #1 is $1"
}

foo 2 # this will work.

Вихід:

;

./myScript.sh: line 2: foo: command not found
Parameter #1 is 2

Посилання: Advanced Bash-Scripting Guide.

Коментарі (9)

Знання мов програмування високого рівня (C/C++/Java/PHP/Python/Perl...) може підказати неспеціалісту, що функції bash повинні працювати так само, як вони працюють в цих мовах. Натомість функції bash працюють як команди командного інтерпретатора і очікують, що їм будуть передані аргументи так само, як можна було б передати опцію команді командного інтерпретатора (ls -l). По суті, аргументи функції в bash розглядаються як позиційні параметри* ($1, $2..$9, ${10}, ${11} і так далі). Це не дивно, враховуючи те, як працює getopts. Для виклику функції в bash дужки не потрібні.


(Примітка: Я зараз працюю над Open Solaris).

# bash style declaration for all you PHP/JavaScript junkies. :-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
function backupWebRoot ()
{
    tar -cvf - $1 | zip -n .jpg:.gif:.png $2 - 2>> $errorlog &&
        echo -e "\nTarball created!\n"
}

# sh style declaration for the purist in you. ;-)
# $1 is the directory to archive
# $2 is the name of the tar and zipped file when all is done.
backupWebRoot ()
{
    tar -cvf - $1 | zip -n .jpg:.gif:.png $2 - 2>> $errorlog &&
        echo -e "\nTarball created!\n"
}

#In the actual shell script
#$0               $1            $2

backupWebRoot ~/public/www/ webSite.tar.zip
Коментарі (0)

Пропустіть батьківські імена та коми:

 myBackupFunction ".." "..." "xx"

і функція повинна мати такий вигляд:

function myBackupFunction() {
   # here $1 is the first parameter, $2 the second etc.
}
Коментарі (0)