(3.6)Case用法

1.case語法結構

  • 模式匹配case
  • 語法結構,相當於if。。。。。。elif。。。。else。。。。
    case語句是從上往下執行的
case 變量 in
模式1)
	命令序列
	;;
模式1)
	命令序列
	;;
模式1)
	命令序列
	;;	
*)
	無匹配後命令序列
esac
  • eg:
#!/usr/bin/bash
#yum config case
yum_server=10.8.40.100
os_vrsion=`cat /etc/redhat-release|awk '{print $4}' \
|awk -F"." '{print $1"."$2}'`

[-d /etc/yum,repos.d] || mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.d /etc/yum.repos.d/bak &>/dev/null

case "$os_version" in ##變量的值去匹配哪個,字符串匹配
7.3)## "7.3"也可以
	cat >/etc/yum.repos.d/centos7u3.repo<<-EOF
	[centos7u3]
	name=centos7u3
	baseurl=ftp://$yum_server/centos7u3
	gpgcheck=0
	EOF
	echo "7.3 yum configure.."
	;;
6.8)
	curl -o /etc/yum.repos.d/centos6u8.repo ftp://$yum_server/centos6u8.repo
	;;
5.9)
	curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirros.aliyun.com/repo/Cetos-5.repo
	;;
*)
	echo "error"
esac

執行:
sh -n yumconfig.sh
  • eg:刪除用戶的腳本
#!/usr/bin/bash
#delete user
#v1.0 by jiwang 2020-2-17
read -p "input a username: " user

id $user &>/dev/null
if [ $? -ne 0 ];then
	echo "no such user: $user"
	exit 1  ##這裏的1隨便定義
fi

read -p "Are you sure?[y/n]: " action
if [ "echo action " == "y" -o "echo action " == "Y" ];then
	userdel -r $user
	echo "$user is deleted"
else
	echo "good!"
	exit 2
fi
===================================================================================

#!/usr/bin/bash
#delete user
#v1.0 by jiwang 2020-2-17
read -p "input a username: " user

id $user &>/dev/null
if [ $? -ne 0 ];then
	echo "no such user: $user"
	exit 1  ##這裏的1隨便定義
fi

read -p "Are you sure?[y/n]: " action
case "$action" in
y|Y\yes)
	userdel -r $user
	echo "$user is deleted"
	;;
*)
	echo "error"
esac

  • command命令:可以判斷後面的命令是不是命令
#!/usr/bin/bash

command1=/bin/date
if command -v $command &>/dev/null;then
	:
else
	yum -y install ..
fi

是命令的話,啥都不做,可以用:表示,:就是true

2.case實現jump Server

  • 要求:只對跳板機提供遠程連接端口,shell腳本的大致框架如下:
    (1)打開個菜單
    (2)echo和read加個提示
    (3)判斷變量的值
    在這裏插入圖片描述
  • eg代碼如下:從跳板機到後面的機器採用密碼驗證登錄
在三個服務器上,分別臨時修改主機名:hostname web1      hostname web2     hostname mysql1
在三個服務器和跳板機上,分別增加用戶名:
useradd alice 
passwd alice
su - alice
===================================================================================
在跳板機上操作:
vim jumpserver.sh

#!/usr/bin/bash
#jumpserver
web1=192.168.122.241
web2=192.168.122.52
mysql=192.168.122.210
clear
while :
do
	#打印
	cat <<-EOF
	1. web1
	2. web2
	3. mysql1
	EOF
	
	read -p "input number: " num
	case "$num" in
	1)
		ssh alice@$web1
		;;
	2)
		ssh alice@$web2
		;;
	3)
		ssh alice@$mysql1
		;;
	"")  ##啥也不幹,'')也行
		echo "error"
	esac
done

  • eg:eg代碼如下:從跳板機到後面的機器採用密鑰驗證登錄
以alice爲主機名進行操作:
ssh-keygen
全都輸入空格,產生公鑰和私鑰
ll .ssh/
ssh-copy-id 192.168.122.52
ssh-copy-id 192.168.122.210
ssh-copy-id 192.168.122.241

執行上面腳本:
sh jumpserver.sh
  • 從遠程10.18.42.101登錄到跳板機,執行的結果如下:在這裏插入圖片描述
  • 在跳板機上,將該jumpserver.sh腳本的絕對路徑放到.bash_profile中,使得腳本自啓動
    在這裏插入圖片描述
  • trap捕捉信號,繼續上面的eg去寫
##trap捕捉信號,沒有做什麼操作,防止腳本退出,使得crl C沒用
#!/usr/bin/bash
#jumpserver
trap "" HUP INT OUIT TSTP
web1=192.168.122.241
web2=192.168.122.52
mysql=192.168.122.210
。。。。。
。。。。。。
  • echo打印有顏色的字體時,是換行的,-n參數可以不換行,繼續上面的eg去寫
。。。
EOF

echo -en "\e[1;32minput number: \e[0m"
read num

case 。。。。
。。。

3.case實現簡單的系統工具箱

  • 工具箱類似如下:
    在這裏插入圖片描述
  • eg:前面的大端提示打印的話,用cat或者echo或者printf去打印
vim system_manager.sh

#!/usr/bin/bash
#system manager
#v1.0 by jiwang 2020-2-18

##函數爲了能重複的調用
menu()
{
	cat <<-EOF
	################################
	#	h. help
	#	f. disk partition
	#	d. filesysytem mount
	#	m. memory
	#	u. sysytem load
	#	q. exit
	################################
	EOF
}

menu
while :       			 ##死循環 while [ 1=1 ]:   或者 while true :    
	do    
	reap -p "Please input[h for help]: " action
	##接着做模式匹配
	case "$action" in
	h)
		clear
		menu
		;;
	f)
		fdisk -l
		;;
	d)
		df -Th
		;;
	m)
		free -m  ##按Mbit顯示
		;;
	u)
		uptime
		;;
	q)
		exit			##exit跳出程序。。。。。。break跳出循環
		;;
	"")					##輸入爲空
		;;
	*)
		echo "error"
	esac
done
echo "finish...."###使用break會執行
發佈了569 篇原創文章 · 獲贊 140 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章