目录
什么是shell脚本
脚本就是把许多命令结合起来并按照命令顺序和脚本格式和脚本语法已完成某一需求的实现
脚本可以干什么
- 自动化软件部署 LAMP/LNMP/Tomcat…
- 自动化管理 系统初始化脚本、批量更改主机密码、推动公钥…
- 自动化分析处理 统计网站访问量
- 自动化备份 数据库备份、日志转储
shell脚本的基本写法
shell脚本第一部分(第一行),魔法字符 #!
指定解释器【必写】
#!/bin/bash 表示以下内容使用bash解释器解析
如果直接将解释器路径写死在脚本中,可能在某些系统就会存在找不到解释器的兼容问题,所以可以使用:#!/bin/bash 解释器
shell脚本第二部分,使用(#号)说明,对脚本的基本内容进行描述(可选)
#!/bin/bash
#以下内容为对脚本的注释内容
#name:名字
#path: 路径
shell脚本第三部分,脚本要实现内容的代码
#!/bin/bash
#以下内容为对脚本的注释内容
#name:名字
#path: 路径
echo 'hello world'
tip: 可以使用 bash -n xxx.sh 来检查脚本的语法
标准执行方式 ./xx.sh 标准执行方式需要有权限
脚本非标准执行方法 source xxx.sh
最简单的脚本就是命令的堆积
#!/bin/bash
#以下内容为对脚本的注释内容
#name:名字
#path: 路径
rm -rf /tmp/*
mkdir /tmp/dir{
1..3}
cp /etc/hosts /tmp/dir1
echo '简单脚本于$(date +%F%T)执行完毕,请检查'
变量
变量的定义
变量就是用来保存可以变化的数据
变量如何定义
变量名=变量值
name=LiBai
echo $name
name=Tom
echo $name #调用变量使用echo
第一次输出的结果是LiBai,而第二次输出的结果是Tom,因为第二次赋值会覆盖掉第一次的赋值
变量定义规则
- 变量名区分大小写
- 变量名不能有特殊符号
- 变量名不能以数字开头但是可以包含数字
- 等号两边不能有任何的空格
- 变量尽量做到见名知意
变量中的切片
A=0123456
echo ${A:2:4} #表示把变量A进行切片,表示从第三个字符进行截取,截取到第4个字符结束
执行结果赋值给某变量
A=$(hostname) 或者使用反撇号 A=`hostname`
交互式定义变量(read)
目的:让用户自己输入变量赋值,比较灵活
语法:read 【选项】 变量名
选项
-p
定义提示用户的信息
-n
定义字符数(限制变量值的长度)
-s
不显示(不显示用户输入的内容)
-t
定义超市时间,默认单位为秒(限制用户输入变量值的超时时间)
用法一:
read -t 3 -p 'name' name #超时时间为3s 提示信息为name 变量名称为 name
用法二:变量值来自文件
read IP < ip.txt #变量IP来自于文本文件ip.txt
定义有类型的变量(declare)
目的:给变量做一些限制,固定变量的类型。比如:整形、只读
语法: declare 【选项】变量名=变量值
选项
-i
将变量看成整数,且以后赋值只能赋值整数
-r
定义只读变量,且以后均不可改变此变量的值
-a
定义普通数组,查看普通数组
-A
定义关联数据,查看关联数组
-x
定义环境变量,相当于 export 以下有讲解
本地变量
本地变量:就是我们自己定义的变量,只有当前进程才可以使用
环境变量
环境变量:当前进行可以调用,且子进程也可以进行调用
env:: 查看环境变量
set: 查看本地变量和环境变量
export:提取本地变量为环境变量
A='qwe' #定义本地变量
export A #提取本地变量为环境变量
或
export B='QWE'
全局变量
全局变量:所有用户所有进程都可以进行调用,且可继承
$HOME/.bashrc 当前bash信息,用户登录时读取
$HOME/.bash_profile 当前用户环境变量,用户登录时读取
$HOME/.bash_logout 当前bash信息,用户退出当前shell信息读取
/etc/bashrc 全局的bash信息,所有用户都生效
/etc/profile 全局环境变量信息
以上信息修改完都需要source执行一下
文件读取顺序
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- /etc/bashrc
- $HOME/.bash_logout
一般情况下局部配置配置文件优于全局配置文件,但是配置文件中是循环语句,写的位置不同生效情况不同,有兴趣自行查看
内置变量(shell本身已定义好,不可修改)
内置变量 | 含义 |
---|---|
$? | 返回上个命令执行后返回状态,返回0表示成功执行,非0表示执行异常或错误 |
$0 | 当前执行的程序和脚本名称 |
$# | 脚本接的参数个数 |
$* | 脚本后面所有参数,参数当成一个整体 ,每个参数以空格隔开 |
$@ | 脚本后面所有参数 ,参数是独立的,全部输出 |
$1-$9 | $1表示第一个参数依次类推,为位置参数 |
$$ | 当前所在进程的进程号 |
$! | 后台运行的最后一个进程号(当前窗口) |
!$ | 调用最后一条历史命令中的参数 |