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
相关文章推荐
- 【Shell脚本学习17】Shell case esac语句
- shell脚本变量,数组与函数
- 使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组
- shell学习二十三--case语句编写mysql启动脚本
- shell学习之一: 变量,数组,判断,循环,函数
- shell脚本 - 学习if语句和变量赋值
- Shell学习(shell中的函数,数组,告警系统需求分析,告警系统主脚本)-2018.12.27
- Shell脚本的基本语法(二) 预定义特殊字符、case语句和函数调用
- shell的一些常用的语句(if语句,变量,for、while、until语句、函数调用、脚本调用)
- shell脚本编程之case语句学习笔记
- shell脚本-循环、case语句,函数及中断控制
- shell脚本编程之case语句学习笔记
- shell脚本 if语句学习笔记
- @shell脚本中数组array常用技巧学习实践@
- Java学习笔记-语句-函数-数组
- Shell脚本学习笔记(五)--函数
- Shell(bash)脚本学习之--------内建/外建,自定义变量和环境变量
- 【Shell脚本学习9】Shell替换:Shell变量替换,命令替换,转义字符
- 【Shell脚本学习8】Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
- shell脚本变量学习小记