Bir Bash fonksiyonuna nasıl parametre aktarılacağını araştırmaya çalışıyorum, ancak karşıma çıkan şey her zaman komut satırından nasıl parametre aktarılacağı oluyor.
Komut dosyam içinde parametreleri geçmek istiyorum. Denedim:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Ancak sözdizimi doğru değil, fonksiyonuma nasıl parametre aktarabilirim?
Bir fonksiyonu bildirmenin iki tipik yolu vardır. Ben ikinci yaklaşımı tercih ediyorum.
function function_name {
command...
}
veya
function_name () {
command...
}
Bir fonksiyonu argümanlarla çağırmak için:
function_name "$arg1" "$arg2"
İşlev, iletilen bağımsız değişkenleri konumlarına göre (adlarına göre değil) ifade eder, yani $1, $2, vb. $0 kodun kendi adıdır.
Örnek:
function_name () {
echo "Parameter #1 is $1"
}
Ayrıca, işlevinizi bildirildikten sonra çağırmanız gerekir.
#!/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.
Çıktı:
./myScript.sh: line 2: foo: command not found
Parameter #1 is 2
Yüksek seviyeli programlama dilleri (C/C++/Java/PHP/Python/Perl...) bilgisi, meslekten olmayan kişilere bash fonksiyonlarının bu diğer dillerde olduğu gibi çalışması gerektiğini düşündürecektir. Bunun yerine, bash fonksiyonları kabuk komutları gibi çalışır ve bir kabuk komutuna (ls -l) bir seçenek aktarılabileceği gibi argümanların kendilerine aktarılmasını bekler. Gerçekte, bash'teki fonksiyon argümanları konumsal parametreler olarak ele alınır ($1, $2..$9, ${10}, ${11}
, vb.). Getopts`un nasıl çalıştığı düşünüldüğünde bu sürpriz değildir. Bash'te bir fonksiyonu çağırmak için parantezler gerekli değildir.
(Not: Şu anda Open Solaris üzerinde çalışıyorum.)
# 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