If条件语句
基础
1、 设置命令执行的条件
在shell环境中,可以根据命令执行后的返回状态值来判断该命令是否成功执行,当返回值为0是表示成功执行,否则表示执行失败。用于特定条件表达式的测试时,可以使用linux系统中提供的专用工具-------test命令
Test命令测试方式: test 条件表达式 或者 [ 条件表达式 ] 注意,方括号与条件表达式语句之间至少需要有一个空格进行分割。
2、 常见的条件操作主要包括文件状态测试、比较整数值大小、比较字符串、以及同时判断多个条件时的逻辑关系。
测试文件状态
文件状态测试是指根据给定的路径名称,判断该名称对应的是文件还是目录,或者判断文件是否可读、可写、可执行等等。
-d:测试是否为目录(directory)
-e:测试目录或者文件是否存在(exist)
-f:测试是否问文件(file)
-r:测试当前用户是否有权限读取(read)
-w:测试当前用户师傅可写入(write)
-x:测试当前用户是否可执行(excute)该文件
-L:测试是否为符号连接(link)文件。
注意:当执行条件测试操作后,可通过预定义变量“$?”可以获得测试命令的返回状态值,从而判断该条件是否成立(返回0表示成立,否则不成立)
例:[ -f /etc/passwd ] -------àecho$?-----à返回值为0,表示成立
整数值比较
是指根据给定的两个整数值,判断第一个数是否大于、等于、小于……第2个数值
-eq:第一个数值等于(equal)第二个数值
-ne:第一个数值不等于(not equal)第二个数值
-gt:第一个数值大于(greater than)第二个数值
-lt:第一个数值小于(lesser than)第二个数值
-le:第一个数值小于或者等于(lesser or equal)第二个数值
-ge:第一个数值大于或者等于(greater or equal)第二个数值
例如:[ 10 –le 11 ] && echo “wangtongpeng” -----à输出结果为wangtongpeng,表示成立
字符串比较
可以用于检查用户输入,例如,在提供交互式操作时,判断用户输入的选项是否与指定的变量内容相匹配
=:表示匹配
!=:表示不匹配
-z:用于检查字符串是否为空 [ -z `cat zero.file` ] && echo “yes”
!:用于取反,表示相反意思
逻辑测试
逻辑测试是指同时使用的两个或者多个条件表达式之间的关系。用户可以同时测试多个条件,根据这些提哦啊件是否同时成立或者只要有其中一个成立等情况,来决定采取何种操作。
&&:逻辑与,表示前后两个表达式都成立时整个测试结果才为真,否则结果为假。在使用test命令形式进行厕所是,此选项可以改为“-a”。
||:逻辑或,表示前后两个或多个条件至少有一个成立时整个测试结果即为真,否则结果为假。在使用test命令形式测试时,此选项可以改为“-o”。
!:逻辑否,表示当指定的条件表达式不成立时,整个测试命令的结果为真。
例如:[ -f /etc/passwd ] || [ -d /var/log ] && echo “yes”-----à结果输出为yes
If语句的结构
1、 单分支if语句
格式:if 条件测试命令
Then
命令序列
Fi
2、 双分支if语句
格式:if 条件测试命令
Then
命令序列1
Else
命令序列2
Fi
3、 多分支if语句
格式:if 条件测试命令1
Then
命令序列1
Elif 条件测试命令2
Then
命令序列2
Else
命令序列3
Fi
使用for循环语句
For循环语句,可以为变量设置一个取值列表,每次读取列表中不同的变量值并执行相关命令操作,变量值用完以后则退出循环,其不需要执行条件判断,其使用变量的取值来自于预先设置的值列表
格式:
For 变量名 in 取值列表
Do
命令序列
Done
例如:
#!/bin/bash
For TM in “morning”“noon”“evening”
Do
Echo “the $TM of the day. ”
Done
当执行这个脚本时,结果为:
The moring of the day.
The noon of the day.
The evening of the day.
使用while循环语句
While语句,可以根据特定的条件重复执行一个命令列表,直到该条件不再成立为止。除非有特殊需要,够则在脚本程序中应该避免出现无限循环执行命令的情况,因为如果无法跳出循环,后边的命令操作将无法执行。所以通常在执行的命令序列中包含修改测试条件的语句,当循环达到一定次数后,测试条件将不再成立,从而可以跳出循环。
格式:
While 条件测试命令
Do
命令序列
Done
Case语句
Case语句适用于需要进行多重分支的应用情况。
格式:
Case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……………….
*)
默认执行的命令序列
Esac
注意:
a. case行的末尾必须为单词“in”,没一个模式必须以右括号“)”结束
b. 双分号“;;”表示命令序列的结束。
c. 匹配模式中可以使用方括号表示一个连续的范围,例如“[1-9]”,使用竖杠符号“|”表示或者
d. 最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行该命令序列。
Shift语句
是bash中一个特殊的内部命令,但是在命令行较少使用,而更多的是用在shell脚本程序中,执行shift命令后,位置变量($1-$9)中的命令行参数会依次向左传递
例如:
如果当前脚本程序获得的位置变量为:$1=file1,$2=file2,$3=file3,$4=file4,$5=file5
则当执行一次shift命令操作时,各个位置变量为:$1=file2,$2=file3,$3=file4,$4=file5
当再次执行,各个位置变量为:$1=file3,$2=file4,$3=file5
如编辑一个相加脚本:
#!/bin/bash
Result=0
While [ $# -gt 0 ]
do
result=`expr $result +$1`
shift
done
echo “the sum is: $result”
测试:./脚本 1 2 3 -------à输出结果为:6
循环控制语句:break命令、continue命令
Break :中断,用于跳出当前所在的循环体,但是并不退出程序。
Continue:继续,用于暂停本次循环,跳转到循环语句的顶部重新测试条件。
例如:编辑一个脚本,删除stu1~stu20各用户,但是保留stu8和stu18
#!/bin/bash
I=1
While [ $i –le 20 ]
Do
If [ $i –eq 8 ] || [ $i –eq 18 ] ; then
Let i++
Continue
Fi
Userdel –r stu$i
Let i++
done