脚本执行方式
- 需要可执行权限
- 相对路径执行
- 绝对路径执行
- 不需要可执行权限
sh 脚本文件名source 脚本文件名// 不会启动子进程,通过pstree查看进程树
定义变量
- 定义变量:
变量名=变量值 - 取消变量:
unset 变量名 - 注意事项:
=两边不能有空格- 不能使用关键字做变量名,如:
ls、cd等 - 如果变量名已存在,则会覆盖之前的变量值
- 变量名称由字母、数字、下划线组成,不能以数字开头
变量类型
- 环境变量:变量名通常大写,由操作系统维护
- 位置变量: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
- 全局变量在当前Shell及子Shell中均有效,定义格式:
数学运算
整数运算
使用$[]或$(())表达式
格式:$[整数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