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 $variable1 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 -l1.70[root@bogon sh]# echo 'scale=2;27/10'|bc -l2.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: " var1input var1: abc[root@bogon ~]# read -p "input var2: " var2input 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: " num1input num1: 20[root@bogon ~]# read -p "input num2: " num2input 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: " num1input num1: 20[root@bogon ~]# read -p "input num2: " num2input 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
条件判断
if判断:
语句示例:read -p "please input your file: " fileif [ -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: " scorecase $score inA|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/bashi=0while [[ $i -le 10 ]]do((i++))if [[ $i -eq 3 ]];then continueelif [[ $i -eq 8 ]];then breakelse echo $ifidone[root@bogon sh]# bash while.sh 124567[root@bogon sh]#
for循环
#!/bin/bashfor i in $(seq -w 10)do echo $idone[root@bogon sh]# bash for.sh 01020304050607080910[root@bogon sh]#