您的位置:首页 > 运维架构 > Shell

shell脚本学习——数组、变量、case语句、函数、制作跳板机

2020-06-04 07:03 639 查看

一、数组
1、普通数组:只能使用整数作为数组索引(元素下标)

数组名[索引下标]=值
marry[0]=n1
marry[1]=n2
marry[2]=n3
数组名=(值1 值2 值3 ...)
marry=(n1 n2 n3 ...)
marry1=(`cat /etc/passwd`)
marry2=(1 2 3 "hello world" [10]=linux)

数组的读取

${数组名[元素下标]}
echo ${marry[0]}   读取数组第一个元素
echo ${marry[*]}   读取数组所有元素
echo ${#marry[*]}   读取数组所有元素个数
echo ${!marry[*]}   读取数组元素的索引下标
echo ${marry[*]:1:2}  读取下标为1的元素开始,获取2个元素
declare -a   查看普通数组元素

2、关联数组:使用字符串作为数组索引(元素下标)

declare -A abc_marry1       查看关联数组元素
数组名[索引or下标]=变量值
abc_marry[linux]=one
abc_marry[java]=two
abc_marry2=([name1]=harry [name2]=jack [name3]=natasha)

二、dirname与basename

A=/root/tmp/shell/mem.txt
echo $A
/root/tmp/shell/mem.txt
dirname $A
/root/tmp/shell     提取目录
basename $A
mem.txt              提取文件名

变量内容的删除和替换

一个%代表从右往左去掉一个
两个%%代表从右往左最大去掉
一个#代表从左往右去掉一个
两个##代表从左往右最大去掉
url=www.baidu.com
echo ${#url}         13
echo ${url#*.}       baidu.com
echo ${url##*.}      com
echo ${url%.*}       www.baidu
echo ${url%%.*}      www

练习
1、统计web服务不同连接状态个数

#!/bin/bash
declare -A array1
states=`ss -natp|grep :80|cut -d' ' -f1`
for i in $states
do
let array1[$i]++
done
for j in ${!array1[*]}
do
echo $j:${array1[$j]}
done

三、case语句
case语句为多重匹配语句
语法结构

case var in
pattern 1)
command1
;;
pattern 2)
command2
;;
pattern 3)
command3
;;
*)
command4
;;
esac

例:
1、不同值执行不同动作

#!/bin/bash
case $1 in
start|S)
service apache start &>/dev/null && echo "启动成功"
;;
stop|T)
service apache stop &>/dev/null && echo "服务停止"
;;
reload|R)
service apache restart &>/dev/null && echo "服务重启"
;;
*)
echo "请输入动作..."
;;
esac

2、提示输入需求,执行动作

#!/bin/bash
read -p "请输入服务名称(vsftpd):" service
case $service in
vsftpd|ftp)
read -p "请选择执行动作(restart|stop):" action
case $action in
stop|S)
service vsftpd stop &>/dev/null && echo "$service服务停止"
;;
start)
service vsftpd start &>/dev/null && echo "$service服务成功"
;;
esac
;;
httpd|apache)
echo "apache is running..."
;;
*)
echo "请输入服务名称(vsftpd):"
;;
esac

3、菜单提示选择功能

#!/bin/bash
menu(){
cat <<-EOF
h  显示命令帮助
f  显示磁盘分区
d  显示磁盘挂载
m  查看内存使用
u  查看系统负载
q  退出程序
EOF
}
menu
source fun.sh    #调用其他函数,先在此处source
while true
do
read -p "请选择操作内容(help h):" action
clear
menu
case $action in
h|help)
menu
;;
f)
lsblk
;;
d)
df -h
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
esac

四、函数
将一组命令集合或语句形成一段可用代码(函数)

方法一:
函数名()
{
函数体(一堆命令的集合,实现具体功能)
}

方法二:
function 函数名()
{
函数体(一堆命令的集合,实现具体功能)
}

vim fun.sh
#!/bin/bash
function menu()
{
cat <<-EOF
h  显示命令帮助
f  显示磁盘分区
d  显示磁盘挂载
m  查看内存使用
u  查看系统负载
q  退出程序
EOF
}

source fun.sh
menu

临时调用函数source
全局调用函数在/etc/bashrc
单个用户调用函数~/.bashrc

函数中的return:结束一个函数;默认返回函数最后一个命令状态值,可给定参数值,0~256;若无return,函数返回最后一个命令的退出状态值。

应用:收集用户输入信息,根据输入信息输出内容

#!/bin/bash
input_fun()
{
input_var=""
output_var=$1
while [ -z $input_var ]
do
read -p "$output_var" input_var
done
echo $input_var
}
#调用函数
name=$(input_fun 请输入姓名:)
sex=$(input_fun 请输入性别:)
age=$(input_fun 请输入年龄:)
case $sex in
man)
if [$age -gt 18 -a $age -le 35 ];then
echo "中年大叔"
elif [ $age -gt 35 ];then
echo "你老了!!!"
else
echo "你好,骚年!"
fi
;;
woman)
echo "你好,美女!"
;;
*)
echo "外星人!"
;;
esac

综合练习
只允许yunwei用户通过跳板机登录服务器做维护

vim jump-server.sh
#!/bin/bash
menu()
{
cat <<EOF
欢迎使用jump-server,请选择主机:
1.DB1-Master
2.DB2-Slave
3.Web1
4.Web2
h.help
q.exit
EOF
}
trap : 1 2 3 19 20    #屏蔽非正常退出信号
menu
while true
do
read -p "请选择主机:" host
case $host in
1|DB1)
ssh root@192.168.1.1
;;
2)
ssh root@192.168.1.2
h)
menu
;;
q)
exit
;;
esac
done

#此脚本放在yunwei账户下:~/jump-server.sh
vim ~/.bashrc
#在最后添加
/home/yumwei/jump-server.sh
exit
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: