1 shell编程用途
通过终端编写脚本程序,辅助开发人员完成工程自动化操作
2 编写规范
- 脚本程序是Unix/Linux系统中的特殊文件,需要妥善管理
- 放在指定路径的scripts/目录下
- 后缀名统一使用.sh
- 第一行代码 #!/bin/bash 指定程序执行
3 执行方式
- 通过命令执行
- bash 文件名
- sh 文件名
- 直接执行(需要执行权限)
- ./文件名
4 注释
- 除第一行的#!/bin/bash,单行注释以 # 开头
- 多行注释(多行注释方法较多,这里只是其中一种)
- :<<自定义字符 注释内容 自定义字符
5 标准输出
- 打印完换行
- echo “要打印的信息”
- 打印完不换行
- echo -n “要打印的信息”
- 可以不加双引号,但规范写法要添加
6 标准输入
- 显示输入信息:
- read -p “提示信息”
- 不显示输入信息
- read -s “提示信息”
7 变量
- 命名规则
- 遵循变量命名规则(见名知义、字母数字下划线组成、数字不能开头)
- 赋值
- 变量名=值
- 两边不需要空格
# 可以用双引号也可以不用双引号
name=Jack
- 使用变量
- 在变量名前面添加 $ 符号 "
- 与其他字符串拼接使用 ${name}_001
echo "name:$name
echo "${name}_001"
- 引号
- 双引号-强引用:输出赋值
- 单引号-弱引用:不输出赋值
8 选择结构
8.1 单分支结构
- 判断表达式中符号的两端或**[ ]内两端**要有空格,赋值没有空格
if 条件
then
条件为True执行的代码
fi
8.2 双分支结构
if [ 条件1 ];then
条件1为True执行的代码
else
条件不满足执行代码
fi
8.3 多分支结构
if [ 条件1 ];then
条件1为True执行的代码
elif [ 条件2 ];then
条件2为True执行的代码
elif ....
else
任何条件都不满足执行的代码
fi
8.3 判断符号
8.3.1 文件判断
- 判断文件是否存在 if [ -e 文件路径 ]
- 判断是否文件 if [ -f 文件路径 ]
- 判断是否文件夹 if [ -d 文件路径 ]
- 判断文件是否可读 if [ -r 文件路径 ]
- 判断文件是否可写 if [ -d 文件路径 ]
- 判断文件是否可执行 if [ -x 文件路径 ]
8.3.2 字符串判断
- 判断两个字符是否相等 if [ s1 = s2 ]
- 判断两个字符是否不相等 if [ s1 != s2 ]
- 判断字符串长度是否为0 if [ -z s ]
- 判断字符串是否为空 if [ -n s ]
8.3.3 整数判断
- 判断是否相等 [ num1 -eq num2 ]
- 判断是否不相等 [ num1 -eq num2 ]
- 判断是否大于 [ num1 -eq num2 ]
- 判断是否小于 [ num1 -eq num2 ]
- 判断是否大于等于 [ num1 -eq num2 ]
- 判断是否小于等于 [ num1 -eq num2 ]
8.3.4 逻辑判断
- 并且关系 [ a && b ] 或 [ a -a b ]
- 或者关系 [ a || b ] 或 [ a -o b ]
- 取反 [ ! a ]
8.4 case流程控制
case 变量 in
变量1)
代码1
;;
变量2)
代码2
;;
*)
全部都没有匹配成功的代码
;;
esac
9 循环结构
9.1 for循环
for 临时变量 in (数据组)
do
循环执行代码
done
9.2 while循环
while 条件
do
循环执行的代码
done
10 整数运算
- 运算符号
- 求和 num1 + num2
- 求差 num1 - num2
- 求积 num1 * num2 或 num1 * num2
- 求商 num1 / num2
- 取余 num1 % num2
- 表达式
- expr 表达式
expr n u m 1 + num1+ num1+num2 # 操作符号两边不加空格是拼接
expr $num1 + $num2 # 相加(其他运算同理)
expr $num1 \ $num2* # expr乘法运算*不能直接使用,否则会报错,需要转义后才能相乘 - $(()) 表达式,可以直接运算,可以赋值
- res=$((num1 + num2))
- $[] 表达式,可以直接运算,可以赋值
- res=$[num1+num2]
- let 关键字
- expr 表达式
let i++
let num+=1
11 函数
11.1 函数声明
- 标准语法
function 函数名称(){
函数中的代码
}
- 简洁方式
函数名称(){
函数中的代码
}
- shell中函数参数传递有自己的方式,不要在括号内添加形式参数
11.2 函数调用
- 直接使用函数名称调用,后面不需要加()
11.3 函数传递
- 参数不需要在函数内声明,直接通过函数获取
- 调用函数的同时传递参数,参数直接放在函数名称后面,用空格分隔
函数名 参数1 参数2 参数3
11.4 函数返回值
- $* 获取所有的参数
- $@ 获取所有的参数
- $# 获取参数的个数
- $n 获取第n个参数
- $? 获取上一个命令或五福执行结果,返回0,执行正常或服务运行中,返回1,执行不正常,返回3,服务已停止;返回4,服务不存在
12 命令替换
先完成 `` 里面的命令行,然后将其结果替换出来
`pwd`