Опитвам се да потърся как да предам параметри във функция на 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
Справка: Ръководство за усъвършенстване на Bash-скриптовете.
Познаването на езици за програмиране от високо ниво (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
Пропуснете тиретата и запетаите:
myBackupFunction ".." "..." "xx"
и функцията трябва да изглежда така:
function myBackupFunction() {
# here $1 is the first parameter, $2 the second etc.
}