一、数组
1、普通数组:只能使用整数作为数组索引(元素下标)
数组名[索引下标]=值marry[0]=n1marry[1]=n2marry[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]=oneabc_marry[java]=twoabc_marry2=([name1]=harry [name2]=jack [name3]=natasha)
二、dirname与basename
A=/root/tmp/shell/mem.txtecho $A/root/tmp/shell/mem.txtdirname $A/root/tmp/shell 提取目录basename $Amem.txt 提取文件名
变量内容的删除和替换
一个%代表从右往左去掉一个两个%%代表从右往左最大去掉一个#代表从左往右去掉一个两个##代表从左往右最大去掉url=www.baidu.comecho ${#url} 13echo ${url#*.} baidu.comecho ${url##*.} comecho ${url%.*} www.baiduecho ${url%%.*} www
练习
1、统计web服务不同连接状态个数
#!/bin/bashdeclare -A array1states=`ss -natp|grep :80|cut -d\' \' -f1`for i in $statesdolet array1[$i]++donefor j in ${!array1[*]}doecho $j:${array1[$j]}done
三、case语句
case语句为多重匹配语句
语法结构
case var inpattern 1)command1;;pattern 2)command2;;pattern 3)command3;;*)command4;;esac
例:
1、不同值执行不同动作
#!/bin/bashcase $1 instart|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/bashread -p \"请输入服务名称(vsftpd):\" servicecase $service invsftpd|ftp)read -p \"请选择执行动作(restart|stop):\" actioncase $action instop|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/bashmenu(){cat <<-EOFh 显示命令帮助f 显示磁盘分区d 显示磁盘挂载m 查看内存使用u 查看系统负载q 退出程序EOF}menusource fun.sh #调用其他函数,先在此处sourcewhile truedoread -p \"请选择操作内容(help h):\" actionclearmenucase $action inh|help)menu;;f)lsblk;;d)df -h;;m)free -m;;u)uptime;;q)exit;;esac
四、函数
将一组命令集合或语句形成一段可用代码(函数)
方法一:函数名(){函数体(一堆命令的集合,实现具体功能)}方法二:function 函数名(){函数体(一堆命令的集合,实现具体功能)}vim fun.sh#!/bin/bashfunction menu(){cat <<-EOFh 显示命令帮助f 显示磁盘分区d 显示磁盘挂载m 查看内存使用u 查看系统负载q 退出程序EOF}source fun.shmenu
临时调用函数source
全局调用函数在/etc/bashrc
单个用户调用函数~/.bashrc
函数中的return:结束一个函数;默认返回函数最后一个命令状态值,可给定参数值,0~256;若无return,函数返回最后一个命令的退出状态值。
应用:收集用户输入信息,根据输入信息输出内容
#!/bin/bashinput_fun(){input_var=\"\"output_var=$1while [ -z $input_var ]doread -p \"$output_var\" input_vardoneecho $input_var}#调用函数name=$(input_fun 请输入姓名:)sex=$(input_fun 请输入性别:)age=$(input_fun 请输入年龄:)case $sex inman)if [$age -gt 18 -a $age -le 35 ];thenecho \"中年大叔\"elif [ $age -gt 35 ];thenecho \"你老了!!!\"elseecho \"你好,骚年!\"fi;;woman)echo \"你好,美女!\";;*)echo \"外星人!\";;esac
综合练习
只允许yunwei用户通过跳板机登录服务器做维护
vim jump-server.sh#!/bin/bashmenu(){cat <<EOF欢迎使用jump-server,请选择主机:1.DB1-Master2.DB2-Slave3.Web14.Web2h.helpq.exitEOF}trap : 1 2 3 19 20 #屏蔽非正常退出信号menuwhile truedoread -p \"请选择主机:\" hostcase $host in1|DB1)ssh [email protected];;2)ssh [email protected])menu;;q)exit;;esacdone#此脚本放在yunwei账户下:~/jump-server.shvim ~/.bashrc#在最后添加/home/yumwei/jump-server.shexit