
作為一個嵌入式Linux工程師,肯定需要編寫 shell 腳本進行一些自動化工作。剛好,我最近就有類似需求——一鍵交叉編譯 DDS。本著“編寫漂亮代碼的原則”,我用到了 shell 函數。
基本語法:
[function] function_name [()]{ do something [return int;]}
[function]:雖然這個關鍵字可以省略不寫,我還是建議寫上,方便閱讀;
(資料圖)
function_name:函數名稱;
do something:函數體,實現函數的具體功能;
[return int]:函數返回值,return是關鍵字,int為具體數值(0,1,2,…)。這個關鍵字也可以省略不寫,這樣函數將以最后一條命令運行的結果作為返回值。
注:帶方括號的關鍵字可以省略。
#!/bin/shtest_funfunction test_fun(){ echo "shell function test!"}test_fun
執行結果:
定義函數后,在調用函數時可以向函數傳入參數。和編程語言不同的是,shell 中定義函數時 無需聲明參數,即帶參數的函數定義還是原始的格式:
[function] function_name [()]{ do something [return int;]}
向函數傳入參數時只需在調用的位置直接輸入參數即可,中間用空格隔開:
function_name arg1 arg2 arg3 ...
在函數內部訪問參數時使用 的形式,n 為 1,2,3,4 …
#!/bin/shfunction test_fun(){ echo "arg1:${1}" echo "arg2:${2}" echo "arg3:${3}" echo "arg4:${4}" echo "arg num:$#" echo "${0}:${0}"}#調用函數test_fun "apple" "pear" "banana" "orange"
${0}:代表的是腳本的名稱,和 C 語言 main 函數中的 argv[0] 意義相同。
$#:存儲的是參數的個數。
""和 **@都表示傳遞給函數的所有*參數的集合。沒有被雙引號包圍時,這兩個的值相同。如果被雙引號包圍,那么意義就不同了:
"$*" 表示將所有的參數合并到一起, 成為一個參數;
"$@" 表示所有的參數仍然是分離的。
通過 for
循環就能看出區別:
#!/bin/shfunction test_fun(){ echo "item in $*" for var in "$*" do echo "$var" done echo "item in $@" for var in "$@" do echo "$var" done}
你可能會遇到這樣的場景——在函數中,你只想 使用后面的幾個參數,忽略前面的參數。
這個時候就可以使用 shift
關鍵字了。
shift n
將全部參數 向左移動 n 個位置,后面的參數移動到前面參數的位置,前面的參數被丟棄。比如 shift 2
指令的最終結果是把原來的 **{3} 移動到 {1} 的位置,{4}移動到 **{2} 的位置 …
#!/bin/shfunction test_fun(){ echo "${1}:${1}" echo "${2}:${2}" echo "${3}:${3}" echo "${4}:${4}" shift 1 echo "after shift 1:" echo "${1}:${1}" echo "${2}:${2}" echo "${3}:${3}"}test_fun "apple" "pear" "banana" "orange"
嗯,shell 函數挺好用的!
標簽: