脚本执行方式
  1. 需要可执行权限
    • 相对路径执行
    • 绝对路径执行
  2. 不需要可执行权限
    • sh 脚本文件名
    • source 脚本文件名 // 不会启动子进程,通过pstree查看进程树
定义变量
  • 定义变量:变量名=变量值
  • 取消变量:unset 变量名
  • 注意事项:
    • =两边不能有空格
    • 不能使用关键字做变量名,如:lscd
    • 如果变量名已存在,则会覆盖之前的变量值
    • 变量名称由字母、数字、下划线组成,不能以数字开头
变量类型
  • 环境变量:变量名通常大写,由操作系统维护
  • 位置变量:shell内置变量,存储脚本执行时的参数
    • 使用$n表示,n为数字序列号:$1$2、…、${10}${11}、…
  • 预定义变量:shell内置变量,可以直接调用但是不能赋值或修改'
    • $0:存储所在的进程或脚本名
    • $$:当前进程的PID
    • $?:命令执行后的返回状态,0-正常,其他-异常
    • $#:已加载的位置变量的个数
    • $*:所有位置变量的值
  • 自定义变量:用户自主设置
多种引号的区别
  • 双引号:允许扩展,以$引用其他变量
  • 单引号:禁用扩展,将$视为普通字符
  • 反引号:将命令执行的输出作为变量值,$()与反引号等效
变量的作用范围
  • 局部变量:新定义的变量默认只在当前Shell中有效,无法在子Shell环境中使用
  • 全局变量:在当前Shell以及子Shell中均有效(export a=1:定义全局变量a
read标准输入取值

read从键盘读入变量值完成赋值

  • 格式:read [参数] [变量名]
  • 参数:
    • -p:提示信息
    • -t:指定超时秒数
    • -s:设置是否在终端显示输入的内容
变量作用范围
  • 局部变量
    • 新定义的变量默认只在当前Shell环境中有效,无法在子Shell环境中使用
  • 全局变量
    • 全局变量在当前Shell及子Shell中均有效,定义格式:export a=1
数学运算

整数运算

使用$[]$(())表达式

格式:$[整数1 运算符 整数2]

小数运算

Bash内建机制仅支持整数运算,不支持小数运算 可以通过计算器软件bc实现小数计算

如果没有该软件需要使用yum安装 bc支持交互式和非交互式两种方式计算,scale=n可以约束小数位

bc也支持比较操作: >,>=,<,<=,==,!= 表达式成立返回1,否则返回0

字符串

字符串比较

中括号与字符串之间和运算符与字符串之间均有有个空格
是否为空:[ -z 字符串 ]
等于:[ 字符串1 == 字符串2 ]
不等于:[ 字符串1 != 字符串2 ]

整数值比较

[ 整数值1 操作符 整数值2 ]

-eq 等于(equal) -ne 不等于(not equal) -ge 大于等于(greater or equal) -le 小于等于(less or equal) -gt 大于(greater than) -lt 小于(less than)

文件状态测试

[ 操作符 文件或目录 ]

-e 判断对象是否存在(exit) -d 判断对象是否为目录(directory) -f 判断对象是否为一般文件(file) -r 判断对象是否有可读权限(read) -w 判断对象是否有可写权限(write) -x 判断对象是否有可执行权限(excute)

组合多个命令
;:顺序执行 ||:前面执行失败继续执行 &&:前面执行成功继续执行
数组

存储多个数据的集合

test=(1 2 3)
echo ${test[0]}
函数

语法格式

function 函数名{
  #命令序列
}
函数名(){
  #命令序列
}

调用

函数名 参数1 参数2 ... 传递的值作为函数的位置参数

中断与退出
continue:结束单次循环 break:跳出循环体 exit:退出脚本
子串截取

${变量:起始位置:长度}

ab=123456
# 统计ab长度
echo ${#ab}
# 输出:6
echo ${ab:2:5}
# 输出:3456