3-1.比较运算
算数运算符
+
加法-
减法*
乘法/
除法%
取余=
赋值==
相等。用于比较两个数字,相等则返回true
。!=
不相等。用于比较两个数字,不相同则返回true
。- 注意:条件表达式要放在方括号之间,并且要有空格,例如:
[$a==$b]
是错误的,必须写成[ $a == $b ]
。
关系运算符
-eq
等于-gt
大于-lt
小于-ge
大于或等于-le
小于或等于-ne
不等于
布尔运算符
-o
或运算。有一个表达式为true
则返回true
。[ $a -lt 20 -o $b -gt 100 ]
返回true
。-a
且运算。两个表达式都为true
才返回true
。[ $a -lt 20 -a $b -gt 100 ]
返回false
。!
非运算。表达式为true
则返回false
,否则返回true
。[ ! false ]
返回true
。
逻辑运算符
&&
逻辑的AND
。[[ $a -lt 100 && $b -gt 100 ]]
返回false
。||
逻辑的OR
。[[ $a -lt 100 || $b -gt 100 ]]
返回true
。
TIP
逻辑运算符与布尔运算符,看上去一样。但是它俩有两点区别:
- 使用逻辑运算符需要加上
[[双大括号]]
,布尔运算符只需要[单大括号]
。 - 逻辑运算符具有特殊的短路功能,可以利用短路特性来实现使用
cmd1
的执行结果控制cmd2
是否执行的效果。
字符串运算符
=
检测两个字符串是否相等,相等返回true
。!=
检测两个字符串是否不相等,不相等返回true
。-z
检测字符串长度是否为0
,为0
返回true
。-n
检测字符串长度是否不为0
,不为0
返回true
。$
检测字符串是否为空,不为空返回true
。
文件测试运算符
-b file
检测文件是否是块设备文件,如果是,则返回true
。-c file
检测文件是否是字符设备文件,如果是,则返回true
。-d file
检测文件是否是目录,如果是,则返回true
。-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true
。-r file
检测文件是否可读,如果是,则返回true
。-w file
检测文件是否可写,如果是,则返回true
。-x file
检测文件是否可执行,如果是,则返回true
。-s file
检测文件是否为空(文件大小是否大于0
),不为空返回true
。-e file
检测文件(包括目录)是否存在,如果是,则返回true
。
TIP
- 在
shell
中,每个语句执行完后,都会返回一个状态码,取值在[0 - 255]
区间内。如果是0
的话,表示语句执行结果是true
, 否则是false
。通常可用$?
来访问该状态码。 test
命令是shell
环境中用于测试条件表达式的工具。结合上一条,我们就可以判断测试语句的结果:shelltest 2 -lt 2 #因为2不小于2 所以结果是false。将会打印除0以外的数字: echo $?
3-2.判断语句
下述判断语句中的中括号 []
也可以使用 test
命令来代替。看个人习惯。
if ... fi
shellif [ expression ] then #Statements to be executed if expression is true fi
也可以写成:
shellif [ expression ]; then #Statements to be executed if expression is true fi
TIP
expression
与中括号[]
之间需要有空格。if
与then
写在同一行的话,需要用分号;
来分隔。
if ... else ... fi
shellif [ expression ] then #Statements to be executed if expression is true else #Statements to be executed if expression is not true fi
if ... elif ... fi
shellif [ expression1 ] then #Statements to be executed if expression1 is true elif [ expression2 ] then #Statements to be executed if expression2 is true elif [ expression3 ] then #Statements to be executed if expression3 is true fi
3-3.循环语句
循环语句分为3种。分别为 for
、while
及 until
。
for
循环。shellarr=('v1' 'v2' 'v3') #这里应该使用${arr[*]} 读取到数组中的所有值 for variable in ${arr[*]} do echo ${variable} done
while
循环shellnum=1 #(()) 可用于数学计算 while ((${num} <= 5)) do echo ${num} let "num++" done
也可以写作:
shellnum=1 #利用判断表达式 中括号或者test while [ ${num} -le 5 ] do echo ${num} let "num++" done
对
let
命令有异议的话,可见链接。until
循环until
循环执行一系列命令直至条件为true
时停止。until
循环与while
循环在处理方式上刚好相反。一般
while
循环优于until
循环,但在某些时候—也只是极少数情况下,until
循环更加有用。shell#打印数字 知道该数字大于等于5 num=0 until [ ${num} -ge 5 ] do echo ${num} let num++ done
3-4.函数
Shell
中也有函数的概念。基本形式如下:
shell
#function前缀可省略
function fun() {
echo "this is a shell function"
#获取函数传参
echo $1
#获取10位及10位以后的传参
echo ${10}
#返回值如果设定的话 只能在0-255之间 即使超过也会默认以0-255循环
return 125
}
#注意调用的时候不用带小括号()
fun
#利用$?可获取函数返回值
echo $?
#如果要传参的话 如下:
fun 1 2 3 4 5 6 7 8 10
总结下:
- 可以带
function fun()
定义,也可以直接fun()
定义,不带任何参数。 - 参数返回,可以显示加
return
返回,如果不加,将以最后一条命令运行结果,作为返回值。return
后跟数值n(0-255)
。 - 函数参数相关如下:
${n}
用来获取第n
位的参数。$#
用来获取参数的总个数。$*
用来获取所有的参数。$?
显示最后命令的退出状态。0
表示没有错误,其他任何值表明有错误。