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會執行