Shell函式傳遞引數

2021-09-27 11:30:36 字數 1282 閱讀 9049

透過現象看本質

若文章對你有幫助請點個???, 表示對我的鼓勵, 非常感謝 ❤️❤️❤️

函式之間呼叫時,如果把$@ (全部引數,可以用shift進行截斷) 直接全部傳遞過去可能會造成引數個數變化,這是因為把帶空格的引數(傳入時用雙引號包裹)解析為了多個引數.

假如有如下指令碼

function say(

) => $2"

}function main(

)# 指令碼的主要入口

main $@

使用者如果輸入: sh ***x.sh 「mr jack」 「this is message」

最後會輸出: mr => jack , 明顯與期待的不符合.

在傳遞引數的過程中,除了第一次不會把引數的空格解析出來,之後都會解析.要避免這種情況,需要在引數兩邊加上".

function say(

) => $2"

}function main(

)# 指令碼的主要入口,這裡也需要加雙引號

# 因為第一次呼叫是在整個指令碼執行時

# shell並不是找main方法開始執行

main "$@"

最後按照使用者期望的輸出

如果把引數提取到變數中,然後把變數傳遞給函式會有什麼效果?

在bash下,不加引號會將第乙個空格前面的解析成命令

sl=

"sleep 10"

$sl# 最後結果是睡眠10秒鐘

在bash下,加引號會將整體解析為乙個命令

sl=

"sleep 10"

"$sl"

# 最後輸出: sleep 10: command not found

要想把引數中的空格不做解析,只有第一次傳遞,或者使用"$@",如果知道具體的引數個數,可以首次把每個引數提取出來,然後都採用"括起來傳遞,到達和"$@"一樣的效果.

在shell中不加特殊說明所有變數儲存都是字串,直接提取字串的內容時,字串中內容會被解析,例如空格,換行符等…… 如果不需要被解析,則需要使用雙引號括起來。

#!/usr/bin/env bash

test=

"1 2"

function check_num(

)# 最後輸出2

check_num $

# 最後輸出1

check_num "$"

shell指令碼 函式傳遞引數

在乙個指令碼中,多個函式之間可能需要相互傳遞引數,之前一直對引數的傳遞以及引用有些疑問,今天做了幾個小測試例子 1 bin bash function f1 function f2 f1 1執行結果 temp2.sh pp mj ubuntu temp2.sh pp f1pp f2pp2 bin b...

shell引數傳遞

1.位置變數引數即可傳入到指令碼的引數,最多可以訪問 9個,比如 sh a b c d 其中 0 是指令碼名字 1 是第乙個引數 a以此類推 2.特殊參量 傳遞到指令碼的引數個數 以乙個單字串顯示所有向指令碼傳遞的引數。與位置變數不同,可以超過9個 指令碼執行的當前id 後台執行的最後乙個程序的程序...

Shell 傳遞引數

在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 n。n代表一 個數字,1為執行 指令碼的第 乙個引數 2為執 行指令碼的 第二個參 數,以此 類推 例項以下 例項我們 向指令碼傳 遞三個參 數,並分 別輸出,其中0 為執行的檔名 bin bash echo shell 傳遞...