定义
把在shell中执行的单个命令,按照一定的逻辑和规则组装到一个文件中,后面执行的时候就可以直接执行这个文件。这个文件称为shell脚本。约定以.sh作为文件后缀
shell文件编写
#!/bin/bash shell脚本第一行,固定写法。此处的#不是注释
#first comond 除了上面的#不是注释外,其他地方的#都是注释
echo hello shell
shell脚本执行
01 bash shell脚本
bash -x shell脚本 单步执行shell脚本
bash对应的是/bin/bash
02 sh shell脚本
sh对应的是/bin/sh/ -> /bin/bash 所以sh和bash是一样的
注:bash和sh执行的时候不需要设置shell脚本执行权限,这样只是把shell脚本作为参数传给bash和sh命令
03 ./shell脚本 需要使用chown配置执行权限
04 shell脚本 需要使用chown配置执行权限,会去PATH环境变量路径查找shell脚本
shell语法
变量
变量定义
- 变量不需要声明,也不用指定类型
- 变量由数字、字母、下划线构成,不能以数字开头
- 通过=号赋值,等号前后不能有空格
变量类型
- 本地变量
格式:VAR_NAME=VALUE
应用场景:在shell脚本中定义一些临时变量时使用,对当前shell进程的子shell进程及其他shell进程无效
- 环境变量
格式:export VAR_NAME=VALUE
应用场景:用于设置临时环境变量,对子shell进程有效,对其他shell进程无效
注意:设置永久环境变量,需要添加到配置文件/etc/profile中,然后执行source /etc/profile 可立刻生效
- 位置变量
格式:sh location.sh args1 args2 args3
使用:
vi location.sh
etho $0 #打印location.sh
etho $1 #打印args1
etho $2 #打印args2
etho $3 #打印args3
说明:位置变量相当于java中main函数的args参数,可以在shell脚本中动态获取外部参数
- 特殊变量
01 $?
说明:返回上一条命令执行的状态码,状态码在0~255之前。0表示成功,其他状态码都是失败
应用场景:在shell脚本中根据上一条命令的执行结果,来执行不同的逻辑
02 $#
说明:返回shell脚本中所有位置参数的个数
使用场景:用于校验位置参数是否符合要求
变量和引号的特殊使用
- '' : 单引号不解析变量,如echo 'name
- "" : 双引号解析变量,如echo "$name",执行结果:hhc
- `` : 反引号把当前变量的值作为命令再次执行,反引号的另外一种写法:VAR_NAME)
案例
'"$name"' vs "'$name'"
循环
for循环
格式1:
for((i=0; i<10; i++))
do
循环体...
done
格式二:
for i in 1 2 3
do
循环体...
done
while循环
格式:
while 测试条件
do
循环体...
done
测试条件
格式:test EXPR 或者[ EXPR ]中括号和表达式之间的空格不能少
整型测试: -gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)、-eq(等于)、-ne(不等于)
字符串测试:=(等号)、!=(不等于)
使用场景:适用于循环次数未知,或不便于使用for直接生成较大列表时
if判断
单分支
格式:
if 测试条件
then
满足条件....
fi
双分支
格式:
if 测试条件
then
满足条件...
else
不满足条件...
fi
多分支
格式
if 测试条件1
then
满足条件...
elif 测试条件2
then
满足条件
else
不满足条件
fi
shell 扩展
实现shell脚本后台执行
nohup sh shell脚本.sh &
标准输出
说明:表示命令或程序输出的正常信息,使用阿拉伯数字1表示
案例:
pwd 1>1.txt 表示把pwd这个程序的标准输出重定向到1.txt文件中,其中1表示pwd程序的标准输出
标准错误输出
说明:表示命令或程序输出的错误信息,使用阿拉伯数字2表示
案例:
pwd 2>2.txt 表示把pwd这个程序的标准错误输出重定向到2.txt文件中,其中2表示pwd程序的标准错误输出
重定向(> 和 >>)
> 和 >>两个重定向的区别:
当使用两个重定向把前一个命令的输出重定向到一个文件时。>重定向会覆盖重定向指定的文件,而>>会在指定的文件后追加内容
crontab定时器
查看crontab服务状态:systemctl status crond
启动/停止crontab服务: systemctl start/stop crond
添加crontab服务: vi /etc/crontab
查看crontab执行日志:vi /var/log/cron