一、Shell是什么
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
二、脚本格式要求
- 脚本 #!/bin/bash 开头
- 脚本需要有可执行权限
- 单行注释:#
- 多行注释::<<! 换行符 注释内容 换行符 !
三、Shell脚本的常用执行方式
- 方式一(输入脚本的绝对路径或相对路径)
说明:首先要赋予脚本可执行权限,再执行脚本。相对路径:./*.sh,绝对路径:/root/*.sh - 方式二(sh 脚本)
说明:不用赋予脚本可执行权限,直接执行即可。比如:sh *.sh
四、Shell变量
①变量分类
- 系统变量
- 用户自定义变量
②变量的定义与撤销
- 定义变量:变量名=变量值
- 声明静态变量:readonly 变量
- 撤销变量:unset 变量,注意:静态变量不能撤销
③变量定义的规则
- 变量名称可以由字母、数字、下划线组成,但是不能以数字打头
- 等号两侧不能有空格
- 变量名称一般习惯大写,这是一个规范,我们遵守即可
④将命令的值赋给变量
- 一对反引号``,比如 A=`date`,将 date 命令返回的值赋给 A变量
- $(),比如 A=$(date),将 date 命令返回的值赋给 A变量
⑤设置环境变量
- export 变量名=变量值 (功能描述:将Shell变量输出为环境变量/全局变量)
- source 配置文件 (功能描述:让修改后的配置信息立即生效)
⑥位置参数变量
作用:帮助我们获取 命令行的参数信息
- $n 功能描述:n为数字,$0表示命令本身,$1-$9代表第1到第9个参数,10以上的参数需要用{}包含,如${10}
- $* 功能描述:代表命令行的所有参数,把所有参数看作一个整体
- $@ 功能描述:代表命令行的所有参数,把每个参数区分对待
- $# 功能描述:代表命令行所有参数的个数
⑦预定义变量
Shell设计者事先已经定义好的变量,可以在shell脚本中直接使用
- $$ 当前进程的进程号(PID)
- $! 后台运行的最后一个进程的进程号
- $? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确
五、运算符
- $((运算式))
- $[运算式] 推荐使用
- expr m + n 或者 expression 表达式。注意 expr 运算符间要有空格,如果希望将 expr 的结果赋给某个变量,使用``,\*,/,% 表示乘,除,取余
六、条件判断
- [ condition ] (注意condition前后要有空格,condition非空返回true,空返回false)
- [ condition ] && echo "ok" || echo "not ok" #效果类似Java的三元运算符
常用判断比较
- = 字符串比较
- 两个整数的比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 按文件权限进行判断
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
- 按照文件类型进行判断
- -f 文件存在并且是一个常规文件
- -e 文件存在
- -d 文件存在且是一个目录
七、流程控制
- if 判断
单分支
if [ condition ]
then
代码
fi
多分支
if [ condition1 ]
then
代码1
elif [ condition ]
then
代码
fi - case 语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行此处代码
;;
"值2")
如果变量的值等于值2,则执行此处代码
;;
"*")
如果变量的值均不等于以上值,则执行此处代码
;;
esac - for 循环
for 变量 in 值1 值2 值3
do
程序/代码
done
for(( 初始值;循环控制条件;变量变化))
do
程序/代码
done - while 循环
while [ condition ]
do
程序/代码
done
注意:while 和 [间有空格,condition 与 [] 间有空格
八、read读取控制台输入
read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了;
参数:
变量:指定读取值得变量名
九、函数
shell编程和其他编程语言一样,有系统函数,也可以自定义函数
- 常用系统函数
basename [string] [suffix] #basename命令会删掉所有得前缀包括最后一个 '/' 字符,如果指定了 suffix,basename 会将 string 中得 suffix 去掉(常用于获取文件名)
dirname 文件绝对路径 #从给定的包含绝对路径的文件名中去除文件名,然后返回剩下的路径(常用于获取路径) - 自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]