ความรู้เกี่ยวกับการเขียนโปรแกรมภาษาระดับสูง (C / C ++ / Java / PHP / Python / Perl ... ) จะแนะนำให้คนธรรมดาฟังก์ชั่นทุบตีควรทำงานเหมือนที่พวกเขาทำในภาษาอื่น ๆ เหล่านั้น แต่ฟังก์ชั่นทุบตีทำงานเช่นคำสั่งเชลล์และคาดว่าข้อโต้แย้งจะถูกส่งผ่านพวกเขาในลักษณะเดียวกับที่หนึ่งอาจส่งผ่านตัวเลือกไปยังคำสั่งเชลล์ (เช่น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
ต้องการใช้ชื่อสำหรับตัวแปร เพิ่งทำสิ่งนี้
declare filename=$1 # declare gives you more options and limits variable scope
ต้องการส่งผ่านอาร์เรย์ไปยังฟังก์ชั่นหรือไม่?
callingSomeFunction "${someArray[@]}" # Expands to all array elements.
ภายในฟังก์ชั่นจัดการข้อโต้แย้งเช่นนี้
function callingSomeFunction ()
{
for value in "$@" # You want to use "$@" here, not "$*" !!!!!
do
:
done
}
ต้องการส่งค่าและอาร์เรย์ แต่ยังคงใช้ "$ @" ภายในฟังก์ชันหรือไม่
function linearSearch ()
{
declare myVar="$1"
shift 1 # removes $1 from the parameter list
for value in "$@" # Represents the remaining parameters.
do
if [[ $value == $myVar ]]
then
echo -e "Found it!\t... after a while."
return 0
fi
done
return 1
}
linearSearch $someStringValue "${someArray[@]}"