原文鏈接:
在這里插入圖片描述
函數(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說明:
- return可以結(jié)束一個(gè)函數(shù)。類似于循環(huán)控制語句break(結(jié)束當(dāng)前循環(huán),執(zhí)行循環(huán)體后面的代碼)。
- return默認(rèn)返回函數(shù)中最后一個(gè)命令狀態(tài)值,也可以給定參數(shù)值,范圍是0-256之間。
- 如果沒有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)用案例
具體需求:
- 寫一個(gè)腳本收集用戶輸入的基本信息(姓名,性別,年齡),如不輸入一直提示輸入
- 最后根據(jù)用戶的信息輸出相對(duì)應(yīng)的內(nèi)容
思路:
交互式定義多個(gè)變量來保存用戶信息 姓名、性別、年齡
-
如果不輸一直提示輸入
- 循環(huán)直到輸入字符串不為空 while 判斷輸入字符串是否為空
- 每個(gè)信息都必須不能為空,該功能可以定義為一個(gè)函數(shù),方便下面腳本調(diào)用
根據(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. 具體要求
- 只允許yunwei用戶通過跳板機(jī)遠(yuǎn)程連接后臺(tái)的應(yīng)用服務(wù)器做一些維護(hù)操作
- 公司運(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
- 當(dāng)用戶選擇相應(yīng)主機(jī)后,直接免密碼登錄成功
- 如果用戶不輸入一直提示用戶輸入,直到用戶選擇退出
3. 綜合分析
- 將腳本放到y(tǒng)unwei用戶家目錄里的.bashrc文件里(/shell05/jumper-server.sh)
- 將菜單定義為一個(gè)函數(shù)[打印菜單],方便后面調(diào)用
- 用case語句來實(shí)現(xiàn)用戶的選擇【交互式定義變量】
- 當(dāng)用戶選擇了某一臺(tái)服務(wù)器后,進(jìn)一步詢問用戶需要做的事情 case...esac 交互式定義變量
- 使用循環(huán)來實(shí)現(xiàn)用戶不選擇一直讓其選擇
- 限制用戶退出后直接關(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)取更多資源