關(guān)于bash函數(shù),這里有一些您不知道的東西。通常當(dāng)你寫(xiě)一個(gè)函數(shù)時(shí),你會(huì)這樣做:
不是嗎?我知道你會(huì)這么做,因?yàn)檫@是所有人寫(xiě)函數(shù)的方式。這就是我要說(shuō)的。在bash中
并不像在JavaScript或c中那樣意味著“函數(shù)的主體”或“函數(shù)的范圍”,它實(shí)際上是一個(gè)復(fù)合命令。你可以做各種稀奇古怪的事情,比如:
function fileExists () [[ -f $1 ]]
不需要那些花括號(hào)!者你可以這樣做:
function isEven () (( $1 % 2 == 0 ))
這個(gè)函數(shù)是一個(gè)算術(shù)計(jì)算式?;蛘吣憧梢赃@樣做:
這將在子shell中生成函數(shù),而不是在當(dāng)前環(huán)境中執(zhí)行。
或者您可以使用while, if, case, select和for。這里有一個(gè)例子:
function sleep1 () while :; do "$@"; sleep 1; done
這個(gè)函數(shù)將創(chuàng)建一個(gè)sleep1函數(shù),該函數(shù)將永遠(yuǎn)每秒運(yùn)行一個(gè)命令。您可以執(zhí)行類(lèi)似sleep1 df -h
這樣的操作來(lái)監(jiān)視磁盤(pán)的更改。
這些技巧不僅使您的代碼更美觀,還能夠讓您快速的寫(xiě)出單行bash程序,而且它們也非常有用。如果您需要為您的函數(shù)創(chuàng)建一個(gè)臨時(shí)環(huán)境,并臨時(shí)更改變量或shell選項(xiàng),那么它將特別有用。
這是我在代碼中找到的一個(gè)例子:
function caseInsensitiveMatch () (
shopt -s nocasematch
....
)
在這里,函數(shù) caseInsensitiveMatch在一個(gè)子shell中執(zhí)行,它能設(shè)置nocasematch選項(xiàng),它的作用域就是這個(gè)函數(shù)。對(duì)于IFS和其他變量,您通常需要臨時(shí)更改。你這樣就不需要保存以前的值,然后恢復(fù)它們。
這是我5分鐘的技巧。你可以在bash man頁(yè)面中查找復(fù)合命令,哪里有所有可能的用法。一旦掌握了這一點(diǎn),您將開(kāi)始編寫(xiě)一些next級(jí)別shell代碼。下次見(jiàn)!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
英文原文:Something you didn't know about functions in bash