一、Shell函數介紹
Shell 是一種命令語言,也是一種腳本語言,Linux下常用的Shell有Bash、Zsh等。Shell 函數是一段可以重複調用的代碼塊,在Shell 命令和程序中通常用來實現一系列任務。函數可以接受參數,在函數內部可以使用這些參數進行操作並返回結果。在Shell 腳本編程中,函數可以提高程序代碼的復用性,使我們更加高效的實現我們的編程任務。
二、Shell函數的定義及調用
Shell 函數的定義格式如下:
函數名() { shell 代碼塊 }
函數名可以自定義,函數體內的代碼塊可以是任何合法的Shell 邏輯代碼,包括流程式控制制語句、命令調用、變數賦值等操作。在Shell 腳本中,函數的調用方式和常規函數調用方式相同,只需要通過函數名來調用該函數即可。
函數名 參數1 參數2 ...
三、參數傳遞的方式
Shell 函數中支持通過參數傳遞的方式來傳遞外部數據,這樣可以使函數具有更加通用性。
1. 位置參數
在函數定義中,$1、$2、$3 等表示第 1、2、3 個參數。如果冒號後面有數字,如 $5,則表示第五個參數。在函數調用中,函數名後面的參數按位置傳遞,第一個參數是 $1,第二個參數是 $2,以此類推。下面是一個簡單的例子,該函數將兩個數字相加,並輸出結果:
add(){ sum=$(($1+$2)) echo "The sum of $1 and $2 is $sum" } add 10 20
該函數會輸出:
The sum of 10 and 20 is 30
2. 特殊參數
除了位置參數之外,Shell 函數還支持一些特殊參數:
$#
表示傳入參數的總數$0
表示腳本或函數名本身$*
表示所有參數以一個字元串的形式傳遞,各個參數由空格分隔$@
表示所有參數以一個字元串的形式傳遞,各個參數由特殊字元分隔。特殊字元可以通過 IFS 環境變數來指定,默認是空格字元
下面是一個使用 $* 和 $@ 參數的例子:
print_args(){ echo "Number of arguments: $#" echo "Arguments using *: $*" echo "Arguments using @: $@" } args=("hello" "world" "how" "are" "you") print_args "${args[@]}"
該函數調用會輸出:
Number of arguments: 5 Arguments using *: hello world how are you Arguments using @: hello world how are you
四、示例
下面是一個綜合使用了函數定義、參數傳遞和特殊參數的案例,該函數可以列出指定目錄下的所有文件和目錄,也可以列出子目錄中的所有內容:
list(){ local dir=$1 local depth=${2:-0} local padding=$(printf "%${depth}s") for file in "$dir/"* do [ -e "$file" ] || continue echo "${padding}-${file##*/}" [ -d "$file" ] && list "$file" $(($depth+1)) done } list "/etc" 2
該函數調用會輸出目錄 /etc 下面深度為 2 的所有文件和目錄:
-/etc/acpi -/etc/adduser.conf -/etc/alchemist -/etc/apparmor -/etc/apport ...
總結
Shell 函數的參數傳遞非常靈活,通過合理地使用函數參數,可以使編程過程變得更簡單和高效。在編寫 Shell腳本時,需要在代碼復用和執行效率之間取得平衡,使用函數是一個非常好的方式來達到這個目的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/270183.html