AI智能
改变未来

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

一、数组
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
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » shell脚本学习——数组、变量、case语句、函数、制作跳板机