shell script的定义
将OS命令堆积到可执行的文件里,由上至下的顺序执行文本的OS命令就是shell脚本。再加上智能(条件/流控)控制,就变成智能化脚本。
shell脚本的基本组成
声明和注释
系统命令
变量
运算符
条件判断
循环结构
函数
shell声明和注释
shell脚本的第一行一般为:
#!/bin/bash
这条语句的作用是指定调用的解释器是/bin/bash。
注释就是脚本中#号后面的内容,类似于C语言的//
shell变量
shell变量有系统变量和自定义变量,这里主要介绍下自定义变量和使用。
定义变量时,变量名不加美元符号($),如:
[root@bogon sh]# variableName='value'
[root@bogon sh]# echo $variableName
value
[root@bogon sh]# variableName=12
[root@bogon sh]# echo $variableName
12
[root@bogon sh]# variable=$(seq 3)
[root@bogon sh]# echo $variable
1 2 3
不仅可以将字符串、数字赋值给一个变量,还可以将命令的结果赋值给变量。
注意,变量名和等号之间不能有空格,这是和其它编程语言不一样的地方
变量名的命名规则:
- 以字母或下划线开头
- 中间不能有空格,可以使用下划线
- 不能使用标点符号
- 不能使用bash里的关键字。(可以help查看保留关键字)
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况就必须加了:
for i in {1..20}
do
echo ${i}%
echo ${i}step
done
所有推荐常用shell编程的人员给所有变量加花括号。
运算符
算数运算符
+ - * / %
加 减 乘 除 取余
linux的数学运算常用(())和bc,例如:
[root@bogon sh]# echo $((5+3))
8
[root@bogon sh]# echo $((5%3))
2
[root@bogon sh]# echo 5%3|bc
2
[root@bogon sh]# echo 5+3|bc
8
[root@bogon sh]#
需要注意:(())只能用于整数的运算,bc有相应选项支持结果是小数,但是当结果是小于1时不显示整数,如下:
[root@bogon sh]# echo 'scale=2;7/10'|bc -l
.70
[root@bogon sh]# echo 'scale=2;17/10'|bc -l
1.70
[root@bogon sh]# echo 'scale=2;27/10'|bc -l
2.70
[root@bogon sh]#
介绍下常用的类似取磁盘使用率百分之多少方法:
[root@bogon sh]# echo 'scale=2;1/3'|bc -l
.33
[root@bogon sh]# echo 'scale=2;1/3'|bc -l|cut -d '.' -f2
33
[root@bogon sh]# echo $(echo 'scale=2;1/3'|bc -l|cut -d '.' -f2)%
33%
关系操作
< > <= >= == != && ||
多与(())连用
赋值运算符
= += *= /= %=
示例:
[root@bogon ~]# echo $((x+3))
5
[root@bogon ~]# x=2
[root@bogon ~]# echo $((x+=3))
5
测试操作
用途:测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其它数值
语法:
test 条件表达式 或者 [ 条件表达式 ]
文件测试
-f FILE 文件存在并且是普通文件
-d FILE 文件存在并且是目录
-e FILE 文件存在
-h FILE 文件存在并且是链接文件
-b FILE 文件存在并且是块设备文件
注意:-f判断文件时,如果文件是链接文件会去判断链接文件的源文件,如果对一个目录下文件分类计数,需要先用-h去判断完链接文件
字符串测试
字符串测试建议使用双方括号,可以解决变量中带空格的问题。里面可以使用通配符。
格式:[[ 字符串1 = 字符串2 ]]
= 两个字符串相等
!= 两个字符串不相等
-z 字符串为空(zero)
-n 非空字符串(nonzero)
示例:
[root@bogon ~]# read -p "input var1: " var1
input var1: abc
[root@bogon ~]# read -p "input var2: " var2
input var2: 123
[root@bogon ~]# [[ $var1 = $var2 ]]
[root@bogon ~]# echo $?
1
[root@bogon ~]# [[ $var1 != $var2 ]]
[root@bogon ~]# echo $?
0
[root@bogon ~]#
数值测试
操作符
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-lt 小于(less than)
-ge 大于等于(greater than or equal)
-le 小于等于(less than or equal)
示例:
[root@bogon ~]# read -p "input num1: " num1
input num1: 20
[root@bogon ~]# read -p "input num2: " num2
input num2: 50
[root@bogon ~]# [ $num1 -ne $num2 ]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [ $num1 -gt $num2 ]
[root@bogon ~]# echo $?
1
[root@bogon ~]# [ $num1 -lt $num2 ]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [ $num1 -le $num2 ]
[root@bogon ~]# echo $?
0
[root@bogon ~]#
不过建议数值比较使用双圆括号如下:
[root@bogon ~]# read -p "input num1: " num1
input num1: 20
[root@bogon ~]# read -p "input num2: " num2
input num2: 50
[root@bogon ~]# ((num1==num2))
[root@bogon ~]# echo $?
1
[root@bogon ~]# ((num1!=num2))
[root@bogon ~]# echo $?
0
[root@bogon ~]# ((num1>num2))
[root@bogon ~]# echo $?
1
[root@bogon ~]# ((num1<num2))
[root@bogon ~]# echo $?
0
[root@bogon ~]# ((num1<=num2))
[root@bogon ~]# echo $?
0
[root@bogon ~]#
条件判断
if判断:
语句示例:
read -p "please input your file: " file
if [ -b $file ];then
echo "$file is block file"
elif [ -f $file ];then
echo "$file is regular file"
elif [ -d $file ];then
echo "$file is directory file"
else
echo "$file type is unknown"
fi
case语句
read -p "please input your score: " score
case $score in
A|a)
echo "your score is A"
;;
B|b)
echo "your score is B"
;;
C|c)
echo "your score is C"
;;
D|d)
echo "your score is D"
;;
*)
echo "input error"
esac
循环结构
while循环
[root@bogon sh]# cat while.sh
#!/bin/bash
i=0
while [[ $i -le 10 ]]
do
((i++))
if [[ $i -eq 3 ]];then
continue
elif [[ $i -eq 8 ]];then
break
else
echo $i
fi
done
[root@bogon sh]# bash while.sh
1
2
4
5
6
7
[root@bogon sh]#
for循环
#!/bin/bash
for i in $(seq -w 10)
do
echo $i
done
[root@bogon sh]# bash for.sh
01
02
03
04
05
06
07
08
09
10
[root@bogon sh]#