SHELL編程之函數(shù)的定義及調(diào)用

原文鏈接:

SHELL編程之函數(shù)的定義及調(diào)用

在這里插入圖片描述

函數(shù)

1. 什么是函數(shù)?

  • shell中允許將一組命令集合語句形成一段可用代碼,這些代碼塊稱為shell函數(shù)
  • 給這段代碼起個(gè)名字稱為函數(shù)名,后續(xù)可以直接調(diào)用該段代碼的功能

2. 如何定義函數(shù)?

方法1:

函數(shù)名()
{
  函數(shù)體(一堆命令的集合,來實(shí)現(xiàn)某個(gè)功能)   
}

方法2:

function 函數(shù)名()
{
   函數(shù)體(一堆命令的集合,來實(shí)現(xiàn)某個(gè)功能)
   echo hello
   echo world
}

函數(shù)中return說明:

  1. return可以結(jié)束一個(gè)函數(shù)。類似于循環(huán)控制語句break(結(jié)束當(dāng)前循環(huán),執(zhí)行循環(huán)體后面的代碼)。
  2. return默認(rèn)返回函數(shù)中最后一個(gè)命令狀態(tài)值,也可以給定參數(shù)值,范圍是0-256之間。
  3. 如果沒有return命令,函數(shù)將返回最后一個(gè)指令的退出狀態(tài)值。

3. 函數(shù)如何調(diào)用?

(一) 當(dāng)前命令行調(diào)用

[root@localhost tmp]# cat fun1.sh 
#!/bin/env bash

hello(){
echo "hello future $1"
hostname
}

menu(){
cat <<-EOF
1. mysql
2. web
3. app
4. exit
EOF
}

[root@localhost tmp]# vim fun1.sh
[root@localhost tmp]# source fun1.sh 
[root@localhost tmp]# . fun1.sh 
[root@localhost tmp]# hello 5201314
hello future 5201314
localhost.localdomain
[root@localhost tmp]# menu
1. mysql
2. web
3. app
4. exit

(二)定義到用戶的環(huán)境變量中

[root@localhost tmp]# vim ~/.bashrc
You have new mail in /var/spool/mail/root
[root@localhost tmp]# cat ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
hello(){
echo "hello future $1"
hostname
}

menu(){
cat <<-EOF
1. mysql
2. web
3. app
4. exit
EOF
}

注意:
當(dāng)用戶打開bash的時(shí)候會(huì)讀取該文件

(三) 腳本中調(diào)用

#!/bin/bash
#打印菜單
source ./fun1.sh
menu(){
cat <<-END
    h   顯示命令幫助
    f   顯示磁盤分區(qū)
    d   顯示磁盤掛載
    m   查看內(nèi)存使用
    u   查看系統(tǒng)負(fù)載
    q   退出程序
    END
}
menu        //調(diào)用函數(shù)

4. 應(yīng)用案例

具體需求:

  1. 寫一個(gè)腳本收集用戶輸入的基本信息(姓名,性別,年齡),如不輸入一直提示輸入
  2. 最后根據(jù)用戶的信息輸出相對(duì)應(yīng)的內(nèi)容

思路:

  1. 交互式定義多個(gè)變量來保存用戶信息 姓名、性別、年齡

  2. 如果不輸一直提示輸入

    • 循環(huán)直到輸入字符串不為空 while 判斷輸入字符串是否為空
    • 每個(gè)信息都必須不能為空,該功能可以定義為一個(gè)函數(shù),方便下面腳本調(diào)用
  3. 根據(jù)用戶輸入信息做出匹配判斷

代碼實(shí)現(xiàn):

#!/bin/bash
#該函數(shù)實(shí)現(xiàn)用戶如果不輸入內(nèi)容則一直循環(huán)直到用戶輸入為止,并且將用戶輸入的內(nèi)容打印出來
input_fun()
{
  input_var=""
  output_var=$1
  while [ -z $input_var ]
    do
    read -p "$output_var" input_var
    done
    echo $input_var
}

input_fun 請(qǐng)輸入你的姓名:

或者
#!/bin/bash
fun()
{
    read -p "$1" var
    if [ -z $var ];then
        fun $1
    else
        echo $var
    fi
}


#調(diào)用函數(shù)并且獲取用戶的姓名、性別、年齡分別賦值給name、sex、age變量
name=$(input_fun 請(qǐng)輸入你的姓名:)
sex=$(input_fun 請(qǐng)輸入你的性別:)
age=$(input_fun 請(qǐng)輸入你的年齡:)

#根據(jù)用戶輸入的性別進(jìn)行匹配判斷
case $sex in
            man)
            if [ $age -gt 18 -a $age -le 35 ];then
                echo "中年大叔你油膩了嗎?加油"
            elif [ $age -gt 35 ];then
                echo "保溫杯里泡枸杞"
            else
                echo "年輕有為。。。"
            fi
            ;;
            woman)
            xxx
            ;;
            *)
            xxx
            ;;
esac

擴(kuò)展延伸:

描述以下代碼含義:   
:()
{
   :|:&
}
:

綜合案例

1. 任務(wù)背景

現(xiàn)有的跳板機(jī)雖然實(shí)現(xiàn)了統(tǒng)一入口來訪問生產(chǎn)服務(wù)器,yunwei用戶權(quán)限太大可以操作跳板機(jī)上的所有目錄文件,存在數(shù)據(jù)被誤刪的安全隱患,所以希望你做一些安全策略來保證跳板機(jī)的正常使用。

2. 具體要求

  1. 只允許yunwei用戶通過跳板機(jī)遠(yuǎn)程連接后臺(tái)的應(yīng)用服務(wù)器做一些維護(hù)操作
  2. 公司運(yùn)維人員遠(yuǎn)程通過yunwei用戶連接跳板機(jī)時(shí),跳出以下菜單供選擇:
歡迎使用Jumper-server,請(qǐng)選擇你要操作的主機(jī):
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
  1. 當(dāng)用戶選擇相應(yīng)主機(jī)后,直接免密碼登錄成功
  2. 如果用戶不輸入一直提示用戶輸入,直到用戶選擇退出

3. 綜合分析

  1. 將腳本放到y(tǒng)unwei用戶家目錄里的.bashrc文件里(/shell05/jumper-server.sh)
  2. 將菜單定義為一個(gè)函數(shù)[打印菜單],方便后面調(diào)用
  3. 用case語句來實(shí)現(xiàn)用戶的選擇【交互式定義變量】
  4. 當(dāng)用戶選擇了某一臺(tái)服務(wù)器后,進(jìn)一步詢問用戶需要做的事情 case...esac 交互式定義變量
  5. 使用循環(huán)來實(shí)現(xiàn)用戶不選擇一直讓其選擇
  6. 限制用戶退出后直接關(guān)閉終端 exit

4. 實(shí)現(xiàn)

#!/bin/bash
# jumper-server
# 定義菜單打印功能的函數(shù)
menu()
{
cat <<-EOF
歡迎使用Jumper-server,請(qǐng)選擇你要操作的主機(jī):
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
EOF
}
# 屏蔽以下信號(hào)
trap '' 1 2 3 19
# 調(diào)用函數(shù)來打印菜單
menu
#循環(huán)等待用戶選擇
while true
do
# 菜單選擇,case...esac語句
read -p "請(qǐng)選擇你要訪問的主機(jī):" host
case $host in
    1)
    ssh root@10.1.1.1
    
    2)
    ssh root@10.1.1.2
    ;;
    3)
    ssh root@10.1.1.3
    ;;
    h)
    clear;menu
    ;;
    q)
    exit
    ;;
esac
done


將腳本放到y(tǒng)unwei用戶家目錄里的.bashrc里執(zhí)行:
bash ~/jumper-server.sh
exit

進(jìn)一步完善需求

為了進(jìn)一步增強(qiáng)跳板機(jī)的安全性,工作人員通過跳板機(jī)訪問生產(chǎn)環(huán)境,但是不能在跳板機(jī)上停留。

#!/bin/bash
#公鑰推送成功
trap '' 1 2 3 19
#打印菜單用戶選擇
menu(){
cat <<-EOF
歡迎使用Jumper-server,請(qǐng)選擇你要操作的主機(jī):
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
EOF
}

#調(diào)用函數(shù)來打印菜單
menu
while true
do
read -p "請(qǐng)輸入你要選擇的主機(jī)[h for help]:" host

#通過case語句來匹配用戶所輸入的主機(jī)
case $host in
    1|DB1)
    ssh root@10.1.1.1
    ;;
    2|DB2)
    ssh root@10.1.1.2
    ;;
    3|web1)
    ssh root@10.1.1.250
    ;;
    h|help)
    clear;menu
    ;;
    q|quit)
    exit
    ;;
esac
done

自己完善功能:
1. 用戶選擇主機(jī)后,需要事先推送公鑰;如何判斷公鑰是否已推
2. 比如選擇web1時(shí),再次提示需要做的操作,比如:
clean log
重啟服務(wù)
kill某個(gè)進(jìn)程

回顧信號(hào):

1) SIGHUP           重新加載配置    
2) SIGINT           鍵盤中斷^C
3) SIGQUIT          鍵盤退出
9) SIGKILL          強(qiáng)制終止
15) SIGTERM         終止(正常結(jié)束),缺省信號(hào)
18) SIGCONT     繼續(xù)
19) SIGSTOP     停止
20) SIGTSTP         暫停^Z

歡迎關(guān)注學(xué)習(xí)交流,領(lǐng)取更多資源
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,711評(píng)論 0 5
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡(jiǎn)書還為我保存起的...
    Jenaral閱讀 3,143評(píng)論 2 9
  • 本文是對(duì)Linux shell編程的一個(gè)學(xué)習(xí)比較,共包括如下章節(jié)的內(nèi)容: 概述 基本語法 結(jié)構(gòu)化語句 函數(shù) 小結(jié) ...
    我是老薛閱讀 903評(píng)論 0 5
  • 第 2 章 SHELL 基礎(chǔ)知識(shí)2.1 shell腳本我們?cè)谏厦婧?jiǎn)單介紹了一下什么是shell腳本,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,644評(píng)論 0 0
  • Shell入門 什么是shell? Shell其實(shí)是一個(gè)命令解釋器,作用是解釋執(zhí)行用戶輸入的命令以及程序等,用戶每...
    酷酷的偉閱讀 492評(píng)論 0 1

友情鏈接更多精彩內(nèi)容