shell
1.shell概述
- 自动化批量系统初始化程序(update,软件安装,时区设置,安全策略…)
- 自动化批量软件部署程序(LAMP/LNMP,Tomcat/LVS/Nginx)
- 管理应用程序(KVM,集群管理扩容,MySQL)
- 日志分析处理程序(pv,UV,)
- 自动化备份恢复程序(MySQL完全备份/增量备份)
- 自动化的管理程序(批量远程修改密码,软件升级,配置更新)
- 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,Tcp status,Apache,MySQl)
- 自动化扩容(增加云主机---->业务上线)
zabbix监控CPU 80% + Python API AWS/ES2(增加或者删除云主机)+ shell Script(业务上线)
- Shell可以做任何事(取决于业务需求)
2. Bash Shell
2.1 shell特性
1. 命令历史:shell进程会其会话中保存此前用户提交执行过的命令;
~]# history
定制history的功能,可通过环境变量实现:
HISTSIZE:shell进程可保留的命令历史的条数;
HISTFILE:持久保存命令历史的文件;
.bash_history
HISTFILESIZE:命令历史文件的大小;
2. 命令用法:
history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]
或 history -ps 参数 [参数…]
-c: 清空命令历史;
-d offset:删除指定命令历史
-r: 从文件读取命令历史至历史列表中;
-w:把历史列表中的命令追加至历史文件中;
history #:显示最近的#条命令;
3. 调用命令历史列表中的命令:
!#:再一次执行历史列表中的第#条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;
注意:命令的重复执行有时候需要依赖于幂等性;
4. 调用上一条命令的最后一个参数:
快捷键:ESC, .
字符串:!$
5. 控制命令历史记录的方式:
环境变量:HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
修改变量的值:
NAME=‘VALUE’
HISTCONTROL=‘ignoredups’ ----->只对当前shell有效
6. 命令补全:
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令;
命令查找机制:
查找内部命令;
根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
给定的打头字符串如果能惟一标识某命令程序文件,则直接补全;
不能惟一标识某命令程序文件,再击tab键一次,会给出列表;
7. 路径补齐:
在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件:
tab:
如果能惟一标识,则直接补全;
否则,再一次tab,给出列表;
8. 命令行展开:
~:自动展开为用户的家目录,或指定的用户的家目录;
{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
例如:
/tmp/{a,b} 相当于 /tmp/a /tmp/b
9. 命令的执行状态结果:
bash通过状态返回值来输出此结果:
成功:0
失败:1-255
命令执行完成之后,其状态返回值保存于bash的特殊变量$?中;
命令正常执行时,有的还回有命令返回值
根据命令及其功能不同,结果各不相同
引用命令的执行结果:
$(COMMAND)
或`COMMAND`
10. 引用:
强引用:’’
弱引用:""
命令引用:``
11.快捷键:
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符;
Ctrl+k:删除光标所在处至行尾的所有字符;
Ctrl+l:清屏,相当于clear
2.2 shell通配符
-
globbing:文件名通配(整体文件名匹配,而非部分
匹配模式:元字符
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
有几种特殊格式
[a-z], [A-Z], [0-9], [a-z0-9]
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:所有空白字符
[[:punct:]]:所有标点符号 [^]:匹配指定范围外的任意单个字符
2.3 shell变量
2.3.1 shell变量概述
- 什么是变量
变量是shell传递数据的一种方法,简单理解:就是用一个固定的字符串去表示不固定的值,便于后续引用.
- 变量命名规范
变量定义时有名称要求:字母,数字,下划线几个组成,尽量字母开头,变量名称最好具备一定的含义
IP=10.0.0.100
IP1=10.0.0.100
Hostname_ip=10.0.0.100
hostname_ip=10.0.0.100
等号是赋值,需要注意:等号两边不能有空格,其次定义的变量不要和系统命令出现冲突
- shell变量定义方式:
- 用户自定义变量:人为定义变量名称
- 系统环境变量:保存的是和系统操作环境相关的数据。
- 位置参数变量:向脚本中进行参数传递,变量名不能自定义,变量作用是固定的。
- 预定义的变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。
- shell变量定义实践
#1 等号左右不能有空格
[root@mage scripts]# var="hello shell"
#2 引用变量用 $变量名
[root@mage scripts]# echo $var
hello shell
[root@mage scripts]# echo ${var}_log
hello shell_log
#3 查看变量,set显示所有变量,包括自定义变量和环境变量
[root@mage scripts]# set |grep "var"
var='hello shell'
#4 引号的使用:单引号是强引用,双引号是弱引用
[root@mage scripts]# echo '$var is good'
$var is good
[root@mage scripts]# echo "$var is good"
hello shell is good
# 注意:在定义变量的时候使用单引号:
# 在引用变量的时候,尽可能的使用双引号
2.3.2. 系统环境变量
#1) 定义环境变量: export 变量,将自定义变量转换成环境变量
[root@mage scripts]# var=hello
[root@mage scripts]# echo $var
hello
[root@mage scripts]# vim a.sh
[root@mage scripts]# cat a.sh
#!/bin/bash
echo $var
[root@mage scripts]# sh a.sh # 执行a.sh命令后,会使用另一个bash去执行,就访问不到$var
[root@mage scripts]# export var=hello
[root@mage scripts]# sh a.sh
hello
#2) 简单使用系统变量
[root@mage scripts]# cat env.sh
#!/bin/bash
echo "用户的家目录:$HOME"
echo "当前主机名称是: $HOSTNAME"
echo "当前所在目录: $PWD"
echo "当前连接服务器使用的地址和端口号: $SSH_CONNECTION"
2.3.3 系统内置的变量
[root@mage scripts]# cat variable.sh
#!/bin/bash
echo "#当前shell的脚本名称: $0"
echo "#第1个shell脚本位置参数: $1"
echo "#第2个shell脚本位置参数: $2"
echo "#第3个shell脚本位置参数: $3"
echo "#所有传递的位置参数是: $*"
echo "#所有传递的位置参数是: $@"
echo "#总共传递参数个数是: $#"
echo "#当前程序运行的PID是: $$"
echo "#上一个命令执行结果:$?"
执行后结果如下:
[root@mage scripts]# bash variable.sh 11 22 33 44 55 66
#当前shell的脚本名称: variable.sh
#第一个shell脚本位置参数: 11
#第2个shell脚本位置参数: 22
#第3个shell脚本位置参数: 33
#所有传递的位置参数是: 11 22 33 44 55 66
#所有传递的位置参数是: 11 22 33 44 55 66
#总共传递参数个数是: 6
#当前程序运行的PID是: 1426
#上一个命令执行结果:0
-----------------------------------------------------------------------
#注意: $*和$@的区别
# $*:把参数作为一个字符串返回
# $@:把每个参数作为一个一个字符串返回
补充: 将命令执行的结果传递给变量.(命令替换)
# 根据系统时间打印今年的时间和明年的时间
[root@mage scripts]# echo "This is $(date +%Y) year"
This is 2021 year
[root@mage scripts]# echo "This is $(($(date +%Y)+1)) year"
This is 2022 year
# 命令的嵌套使用,使用$($())
[root@mage /]# find /root/ -name *.txt
[root@mage ~]# db=$(tar zcvf root.tar.gz $(find /root/ -name *.txt))
[root@mage ~]# echo $db # 查看$db变量中存储的值
3. shell变量赋值
除了自定义变量, 以及系统内置变量,还可以使用read命令通过交互式方式传递变量
-
read语法
[root@mage scripts]# cat read_1.sh #!/bin/bash read -p "提示信息:" var1 # read -t 5 -p "提示信息:" var2 echo "你输入的信息是" $var