日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux脚本编程有参函数,shell脚本编程进阶:函数

發(fā)布時間:2023/12/18 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux脚本编程有参函数,shell脚本编程进阶:函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、函數(shù)介紹

函數(shù)function是由若干條shell命令組成的語句塊,實現(xiàn)代碼重用和模塊化編程;

它與shell程序形式上是相似的,不同的是它不是一個單獨的進(jìn)程,不能獨立運行,而是shell程序的一部分;

函數(shù)和shell程序比較相似,區(qū)別在于:

(1)Shell程序在子Shell中運行;

(2)Shell函數(shù)在當(dāng)前Shell中運行;因此在當(dāng)前Shell中,函數(shù)可以對shell中變量進(jìn)行修改;

例如:

腳本1:clean.sh:rm -rf /app/x/*

腳本2:f1.sh:

#!/bin/bash

echo f1.sh

/app/bin/clean.sh(bash調(diào)用)

二、定義函數(shù)

定義函數(shù)=定義別名;

建議不要用與系統(tǒng)cmd相同的函數(shù)名;

企業(yè)規(guī)范函數(shù)命名:f_name 或者 func_name;

declear -f f_name 查看某個函數(shù)

declear -f 查看所有函數(shù)

declear -x 查看所有環(huán)境變量

unset f_name 取消(刪除)函數(shù)

函數(shù)(兩部分組成):函數(shù)名和函數(shù)體;

help function

語法一:

function f_name {

...函數(shù)體...

}

語法二:

function f_name(){

...函數(shù)體...

}

語法三:(建議)

f_name(){

...函數(shù)體...

}

注意:

function f_name(){ cmd; }

不換行——必須加 ;和 “空格”(中括號里);

例如:

function clean () { echo clean1;echo clean2; }

clean

unset clean

三、函數(shù)的定義和使用

1.函數(shù)——聲明、定義;函數(shù)生效——調(diào)用;(先定義,后調(diào)用)

2.函數(shù)只有被調(diào)用才會執(zhí)行;

3.調(diào)用方法:給定函數(shù)名;

4.函數(shù)名出現(xiàn)的地方,會被自動替換為函數(shù)代碼;

5.函數(shù)的生命周期:被調(diào)用時創(chuàng)建,返回時終止;

(1)交互式環(huán)境下定義函數(shù);(類似cat)

f_name {

>...

>...

>}

(2)將函數(shù)放在腳本文件中作為它的一部分;

在腳本前面先定義函數(shù);然后在調(diào)用函數(shù);只適用于自己使用;

#!/bin/bash

f_name {

echo f_name

}

f_name

(3)放在只包含函數(shù)的單獨文件中;(可以被其他文件調(diào)用)

系統(tǒng)定義的函數(shù)都放在這個文件:cat /etc/init.d/functions;

grep '^.*().*' /etc/init.d/functions|wc -l 統(tǒng)計函數(shù)庫中函數(shù)個數(shù)

自己可以定義:vim functions (定義函數(shù)的文件,可以不寫shebang機制)

f_name1 {

echo f_name

}

f_name2 {

echo f_name

}

例如:testfuc.sh

#!/bin/bash

. /app/bin/functions (調(diào)用函數(shù)庫)

echo cmd1 (腳本自己的程序)

f_name1 (調(diào)用的函數(shù))

f_name2 (調(diào)用的函數(shù))

四、函數(shù)返回值(兩種)

1.函數(shù)的執(zhí)行結(jié)果返回值

(1)使用echo等命令進(jìn)行輸出;

(2)函數(shù)體中調(diào)用命令的輸出結(jié)果;

2.函數(shù)的退出狀態(tài)碼

(1)默認(rèn)取決于函數(shù)中執(zhí)行的最后一條命令的退出狀態(tài)碼;

(2)自定義退出狀態(tài)碼,其格式為:

return 從函數(shù)中返回,用最后狀態(tài)命令決定返回值

return 0 無錯誤返回

return 1-255 有錯誤返回

例1

vim functions

func1 {

echo 100

}

func2 {

echo func2-cmd1

return(100或者exit)

echo func2-cmd2

}

. functions 使系統(tǒng)里有緩存(如果更改functions文件,需要重新使其重新生效,就執(zhí)行此操作)

func1:100 使系統(tǒng)里有緩存

let i=`func1`+200 `func1`可被其他命令調(diào)用(即:當(dāng)做別名使用)

echo $i:300

func2:(1)return:退出函數(shù);(2)exit:退出腳本;

例2

vim testfunc.sh

. /app/bin/functions(例1中的functions庫)

func2 (例1中的func2)

echo continue

testfunc.sh(運行)

(1)return:退出函數(shù);func2-cmd1 continue

(2)exit:退出腳本;func2-cmd1

例3

vim testfunc.sh

. /app/bin/functions(例1中的functions庫)

func2 (例1中的func2)

echo $? return 顯示:0(真);return 100 顯示:100(假);

echo continue

五、使用函數(shù)文件

1.可以將經(jīng)常使用的函數(shù)存入函數(shù)文件,然后將函數(shù)文件載入shell;

2.文件名可任意選取,但最好與相關(guān)任務(wù)有某種聯(lián)系;例如:functions.main;

3.一旦函數(shù)文件載入shell,就可以在命令行或腳本中調(diào)用函數(shù);

set 查看所有定義的函數(shù),其輸出列表包括已經(jīng)載入shell的所有函數(shù);

4.若要改動函數(shù),首先用unset命令從shell中刪除函數(shù);改動完畢后,再重新載入此文件;

國際象棋(思路)

red(){ echo -e '\033[41m \033[0m'; };red

red;red;red;red

yellow(){ echo -e '\033[43m \033[0m'; };yellow

yellow;yellow;yellow;yellow

red;red;red;red;yellow;yellow;yellow;yellow

六、函數(shù)參數(shù)

cat /etc/init.d/sshd

腳本調(diào)用參數(shù)

(空格)/etc/init.d/sshd status

(空格)/etc/init.d/sshd restart

1.函數(shù)可以接受參數(shù)

(1)傳遞參數(shù)給函數(shù)

調(diào)用函數(shù)時,在函數(shù)名后面以空白分隔給定參數(shù)列表即可;

例如:“testfunc arg1 arg2 ...”;

(2)在函數(shù)體中,

使用 $1, $2, ...調(diào)用這些參數(shù);還可以使用 $@, $*, $# 等特殊變量;

(1)vim functions

func {

echo 1st is $1

echo 2st is $2

echo all args are $*

echo the arg numbers is $#

echo funcname is $0

}

max {

[ $1 -gt $2 ] && echo max is $1 || echo max is $2

}

(2)testfunc1.sh

. /app/bin/functions

func a b c

echo continue

(3)testfunc2.sh

. /app/bin/functions

max 10 20

echo continue

(4). functions 更改functions文件,需要重新使其重新生效

2.函數(shù)變量

變量作用域

(1)環(huán)境變量:當(dāng)前shell和子shell有效;

(2)本地變量:只在當(dāng)前shell進(jìn)程有效,為執(zhí)行腳本會啟動專用子shell進(jìn)程;作用范圍是當(dāng)前shell腳本程序文件,包括腳本中的函數(shù);

(3)局部變量:函數(shù)的生命周期;函數(shù)結(jié)束時變量被自動銷毀;

(4)注意:如果函數(shù)中有局部變量,如果其名稱同本地變量,使用局部變量

(5)在函數(shù)中定義局部變量的方法

local NAME=VALUE

使用腳本中定義的變量(最好加上括號)

(1)vim functions

func () {

(var=fuc)函數(shù)是否定義變量

echo $var

echo func-cmd1

return 100

echo func-cmd2

}

(2)vim testfunc.sh

. /app/bin/functions

var=testfunc

func

echo continue

(3). functions 更改functions文件,需要重新使其重新生效

(4)testfunc.sh

函數(shù)未定義變量:testfunc func-cmd1 continue

函數(shù)定義變量:func func-cmd1 continue

變量名相同時,函數(shù)里的變量可以更改腳本中的變量;所以盡量避免變量名稱相同(防止混亂);

local NAME=VALUE 此變量只在函數(shù)中有效

為了區(qū)分,可以統(tǒng)一變量名:local local_NAME=VALUE

步驟1:vim functions

func () {

local var=fuc

echo $var

echo func-cmd1

return 100

echo func-cmd2

}

步驟2:vim testfunc.sh

. /app/bin/functions

var=testfunc

echo var=$var

func

echo var=$var

echo continue

步驟3:. functions 更改functions文件,需要重新使其重新生效

步驟4:bash testfunc.sh

七、函數(shù)遞歸

函數(shù)遞歸:函數(shù)直接或間接調(diào)用自身;注意遞歸層數(shù);

n!=1×2×3×...×n

n!=(n-1)!×n

n!=(n-2)!×(n-1)×n

vim fact.sh

#!/bin/bash

fact () {

if [ $1 -eq 0 -o $1 -eq 1 ]; then

echo 1

else

echo $[$1*$(fact $[$1-1])]

fi

}

fact $1(調(diào)用自己+參數(shù))

執(zhí)行操作

fact.sh 10

fact.sh -1 死循環(huán);直至資源耗盡;

killall fact.sh

pstree -p 保留原來狀態(tài)(進(jìn)程),循環(huán)下一個狀態(tài)(進(jìn)程);

ps auxf|less

linux遞歸函數(shù)調(diào)用,嵌套深度無限制;編寫腳本時,要注意合理利用函數(shù)調(diào)用;

Paste_Image.png

fork炸彈

1.fork炸彈

一種惡意程序,它的內(nèi)部是一個不斷在fork進(jìn)程的無限循環(huán),實質(zhì)是一個簡單的遞歸程序;

由于程序是遞歸的,如果沒有任何限制,這會導(dǎo)致這個簡單的程序迅速耗盡系統(tǒng)里面的所有資源;

2.函數(shù)實現(xiàn)

:() { :|:& };:

bomb() { bomb | bomb & }; bomb

3.腳本實現(xiàn)

cat bomb.sh

#!/bin/bash

./$0|./$0&

八、匿名函數(shù)和環(huán)境函數(shù)

匿名函數(shù):{ cmd1;cmd2 }

環(huán)境函數(shù)

(1)定義函數(shù);

(2)declare -fx 或 export -f 聲明環(huán)境函數(shù);

(3)調(diào)用;

讓子進(jìn)程繼承父進(jìn)程的函數(shù);

Paste_Image.png

總結(jié)

以上是生活随笔為你收集整理的linux脚本编程有参函数,shell脚本编程进阶:函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。