linux shell脚本
1. 变量定义和引用
=
两边不能有空格
使用$变量名
来引用变量值
a=1
b='str'
echo $a $b
2. IF语句
2.1 基本格式
if 测试条件
then 语句1
else 语句2
fi
if 测试条件1
then 语句1
elif 测试条件2
then 语句2
else 语句3
fi
一个分支执行多条命令
if 测试条件
then
语句1
语句2
else
语句3
...
语句n
fi
if, then, else, fi等都是关键字,不能放在同一行,如果在同一行要用;
隔开,如下
if 测试条件 ; then 语句1 ;else 语句2; fi
2.2 测试条件
- 普通命令
- test命令
- [ ] 或[[ ]]
注意
- 任意普通命令只要执行成功(返回值是0)则条件成立
- test命令和 [ ]等价,即
[ expr ]
等价于test expr
- [ 和 ] 的左右两边必须有空格
2.2.1 常用test测试表达式
test表达式主要用来文件、字符串、整数判断
表达式的运算符和数值之间空格能有则有,千万别省,除非是赋值语句
文件判断:
-f 文件名
检测普通文件是否存在
-d 文件名
是否为目录
-r 文件名
是否有读权限
-w 文件名
是否有写权限
-x 文件名
是否有执行权限
字符串判断:
s1 = s2
s1与s2相等,则true
-n s1
字符串不空则true
-z s1
字符串空则true
s1 > s2
, ASCII比较,[]
需要把<
转义为\<
, [[]]
中无需转义
s1 < s2
同上
注意:判断是否相等可以是=,也可以是==。但注意两边必须有空格。若=是赋值,则=两边不能有空格。
大于小于号在test表达式中需要转义,在[[]]表达式中不用转义
[ $a \< $b]
[[ $a < $b ]]
整数判断
int1 -eq int2
两个整数相等,则true
int1 -le int2
int1小于等于int2,则true
-lt
小于
-ge
大于等于
-gt
大于
整数判断千万不要直接用大于小于号,要是想用需要用双括号括起来,如:
a=105
b=15
if (($a < $b))
then ...
else ...
fi
if [ $a -gt $b ];then ...;fi
逻辑运算
! 非
-a 逻辑与(and)
-o 逻辑或(or)
[ -f "$1" -a -x "$1" ]
正则表达式
=~用来正则表达式匹配,左边是字符串,需要用引号,右边是正则表达式,不要引号。只要能匹配就是true。详见man bash
例如:
if [[ " MRPC RTE STSB CoLA " =~ MRPC ]]; then
echo .....
fi
3. 数组
定义数组:
glue_low=(MRPC RTE STSB CoLA)
获取数组元素:
# 赋值
glue_low[0]
glue_low[1]=SST
# 读取
task=${glue_low[2]}
获取数组所有元素:
${glue_low[@]}
${glue_low[*]}
set
set -...: 开启某选项
set +...: 关闭某选项
set -o [option]: 具体设置某选项/输出所有选项的值
set -e: 出错就终止
set -u: 遇到未定义变量也终止
set -o pipefail: 管道中有错也停止
set -x: 开启命令回显
set +x: 关闭命令回显
一般脚本设置:set -euo pipefail
4. 数学算数表达式
let a=3+3
或
a=$((3+3))
# a=6
b=8
a=$(($b+1))
# a=9
5. 单引号中转义单引号
由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号($),然后再对里层的单引号转义。
# 不正确
$ echo it's
# 不正确
$ echo 'it\'s'
# 正确
$ echo $'it\'s'
不过,更合理的方法是改在双引号之中使用单引号。
$ echo "it's"
it's
$ echo $'it\'s'
it's
$