linux shell脚本简明笔记教程
1. 变量定义和引用
=
两边不能有空格
使用$变量名
来引用变量值,也可以用${变量名}
a=1
b='str'
echo $a $b ${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 测试条件
if只能根据命令返回值是否为0进行判断,linux提供了test命令方便进行各种条件判断,test的别名就是方括号
- 普通命令
- test命令
- [ ] 或[[ ]]
注意
- 任意普通命令只要执行成功(返回值是0)则条件成立
- test命令和 [ ]等价,即
[ expr ]
等价于test expr
- 对于单方括号,[ 和 ] 的左右两边必须有空格
2.2.1 普通命令
if ls | grep hello; then
echo "hello exist."
else
echo "no file contanis hello"
fi
2.2.1 test命令和方括号
test命令和方括号是等价的,比如
test $a = $b
# 等价于
[ $a = $b ]
实际上左方括号[ 也是一个普通的可执行程序,中间都是他的参数,只是最后一个参数必须是右方括号。test命令根据条件做出判断,决定返回0或者非0,在if条件中实际上还是在看该命令的返回值。
test表达式主要用来文件、字符串、整数判断
表达式的运算符和数值之间空格能有则有,千万别省,除非是赋值语句
文件判断:
-f 文件名
检测普通文件是否存在
-d 文件名
是否为目录
-r 文件名
是否有读权限
-w 文件名
是否有写权限
-x 文件名
是否有执行权限
举例子:
if [ -f "/etc/hosts" ];then
echo "File exists."
else
echo "File not exists."
fi
字符串判断:
s1 = s2
s1与s2相等,则true
-n s1
字符串不空则true
-z s1
字符串空则true
s1 > s2
, ASCII比较,[]
需要把<
转义为\<
, [[]]
中无需转义
s1 < s2
同上
举例子:
if [ "${a}" = "${b}" ];
echo "Str equal"
else
echo "Str not equal"
fi
注意:判断是否相等可以是=,也可以是==。但注意两边必须有空格。如果=是赋值,则=两边不能有空格。
大于小于号在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
$