脚本执行方式
- 需要可执行权限
- 相对路径执行
- 绝对路径执行
- 不需要可执行权限
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