一、数组
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 [email protected]
;;
2)
ssh [email protected]
h)
menu
;;
q)
exit
;;
esac
done
#此脚本放在yunwei账户下:~/jump-server.sh
vim ~/.bashrc
#在最后添加
/home/yumwei/jump-server.sh
exit