在编写Shell脚本时候,经常需要判断两个字符串是否相等,检查文件状态或者是数字的测试等。Shell提供了对字符串、文件、数值等内容的条件测试以及逻辑流程控制。
条件测试操作
常用得测试操作
test
命令,测试特定得表达式是否成立,当条件成立时,命令返回值为0,否则为其它值。
格式1:
test 条件表达式
格式2:[ 条件表达式 ]
//常用格式,使用方括号时,要注意在条件两边加上空格。
常见得测试类型:
- 测试文件状态
- 字符串比较
- 整数值比较
- 逻辑测试
测试文件
格式:
[ 操作符 文件或目录 ]
操作符 | 说明 |
---|---|
-d | 测试是否为目录 ,是则为真 (Directory ) |
-e | 测试目录或文件是否存在,存在则为真(Exist ) |
-f | 测试是否为文件,是则为真(file ) |
-r | 测试当前用户是否有权限读取,是则为真(read ) |
-w | 测试当前用户是否有权限写入,是则为真(write ) |
-x | 测试当前用户是否可执行该文件,可执行则为真(Excute ) |
-L | 测试是否为符号链接文件,是则为真(Link ) |
-nt |
file1 -nt file2 如果 file1 比 file2 新(修改时间),则为真 |
-ot |
file1 -ot file2 如果 file1 比 file2 旧(修改时间),则为真 |
字符串比较
格式
[ String1 = String2 ]
[ String1 != String2 ]
[ -z String ]
操作符 | 说明 |
---|---|
= | 字符串内容相同则为真,就是说包含的文本一摸一样。 |
!= | 字符串内容不同,则为真(!号表示相反的意思) |
-z | 字符串内容为空(长度为零)则为真 |
-n | 字符串内容非空(长度非零)则为真 |
< | string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真 |
> | string2 如果string1在本地的字典序列中排在string2之后,则为真 |
注意:
- 在=前后各有一个空格,如果没有空格就是赋值的关系,不是比较的关系。
- 字符串的
>
<
比较运算符,一般放在[[ ]]
之中,而不是test ("[]")
- 字符串的
>
<
比较的结果,与本地的locale有关,是按照其字典序列进行比较的
整数值比较
格式:
[ no1 操作符 no2 ]
操作符 | 说明 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-le | 小于等于 |
-ge | 大于等于 |
逻辑测试
格式:
[ 表达式1 ] 操作符号 [ 表达式2 ]
操作符 | 说明 |
---|---|
-a 或 && | 逻辑与、前后两个表达式都成立时整个测试结果才为真,否则为假 |
-o 或 || | 逻辑或、操作符两边至少一个为真时,结果为真,否为为假 |
! | 逻辑否 、 当制定条件不成立时,返回结果为真 |
流程控制语句
与其他变成语言一样,shell有自己的流程控制语句,其中包括条件语句、循环语句、选择语句等。
if条件语句
if 单分支: 当条件成立时执行相应的操作。
if 条件测试操作
then 命令序列
fi
#!/bin/bash
# 当/boot分区的使用空间超过80%,就输出报警信息
use=`df -hT|grep "/boot" | awk '{print $5}' | cut -d "%" -f1`
if [[ $use -gt 80 ]];
then
echo "Warning!!/boot disk is full"
fi
if 双分支:当条件成立、条件不成立时执行不同操作。
if 条件测试命令
then 命令序列1
else 命令序列2
fi
#!/bin/bash
# 判断一个用户是否存在
#
No=`id -u $1`
if [[ "$No" -gt 0 ]];then
echo "$1 is exsit"
else
useradd $1 &> /dev/null&& echo "$1 is add"
fi
if多分枝:相当于if语句嵌套,针对多个条件执行不同操作。
if 条件测试命令1 ; then
命令序列1
elif 条件测试命令2 ; then
命令序列2
elif ...
else
命令序列n
fi
#!/bin/sh
SYSTEM=`uname -s` #获取操作系统类型,我本地是linux
if [ $SYSTEM = "Linux" ] ; then #如果是linux的话打印linux字符串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi #ifend
for循环语句
根据变量的不同取值,重复执行一组命令操作。
for 变量名 in 取值列表
do
命令序列
done
#!/bin/bash
#
for i in 1 2 3 4 5;do //{1..5}
echo $i
done
while循环
重复测试指令的条件,只要条件为真则反复执行对应的命令操作,直到条件为假。如果使用true作为循环条件能够产生无限循环。
while 命令表达式
do
命令列表
done
#!/bin/bash
#批量添加20个系统账户用户名依次为user1~20
i=1
while [ $i -le 20 ];do
useradd user$1
echo "123456" | passwd --stdin user$i &> /dev/null
i=`expr $i + 1`
done
只要特定条件为真,”while” 语句就会循环执行。
case多重分支语句
根据变量的不通取值,分别执行不同的命令操作。
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
*)
默认执行的命令序列
;;
esac
#!/bin/bash
case $1 in
start)
echo "start [mysql](http://man.linuxde.net/mysql "mysql命令")"
;;
stop)
echo "stop mysql"
;;
*)
echo "usage: $0 start|stop"
;;
esac
until循环语句
根据条件执行重复操作,直到条件成立为止。只要特定条件为假,它们就重复循环,直到条件为真。
until 条件测试命令
do
命令序列
done
#!/bin/bash
#
num=1
until [ $num -gt 10 ];do
echo $num
num=$(( $num + 1))
done
break控制语句
break语句:在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句。
# cat break.sh
#!/bin/bash
#
num=1
until [ $num -gt 10 ];do
echo $num
if [ $num -gt 5 ];then break ;fi //当num>5时,跳出整个循环
num=$(( $num + 1))
done
# bash break.sh
1
2
3
4
5
6
continue控制语句
continue语句:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环。
while<-------+
do |
|
commands | 跳回当前循环,重新开始下一次循环(通常在循环体中与条件语句一起使用)
commands |
|
continue----+
commands
commands
commands
done
commands
commands
网友评论