shell语法

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]#
posted @ 2017-05-15 21:22  村口王铁匠  阅读(311)  评论(0编辑  收藏  举报