linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句
条件测试操作
条件测试是专为影响"$?"的操作,是条件转移、循环语句的基础
test测试命令:
test
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他非0数值($?)。
格式:test 条件表达式
[ 条件表达式 ]
功能:检查文件和比较值
test表达式类型分为四类
常见的测试类型
①测试文件状态
②整数值比较
③字符串比较
④逻辑测试
1)文件测试判断格式:
test 操作符 文件
[ 操作符 文件或目录 ]
常用的测试操作符
文件名,文件类型
-d file 如果文件为一个目录,则为真(文件目录)
-e file如果文件存在,则为真(文件存在)
-f file 如果文件为一个普通文件,则为真(普通文件)
-b file 如果文件为一个块特殊文件,则为真(块设备)
-c file 如果文件为一个字符特殊文件,则为真(字符设备文件)
-L file 同-h,测试是否为符号链接 软连接(link)文件(软连接)
文件权限检测
-r file 如果文件可读,则为真(文件可读)
chmod o-r file
-w file 如果文件可写,则为真(文件可写)
-x file 如果文件可执行,则为真(文件执行)
-O file 如果文件存在并且归该用户所有,则为真(用户)
-G file 如果文件存在且归该组所有,则为真(组)
-g file 如果设置了文件的 SGID 位,则为真(SGID)
-u file 如果设置了文件的 SUID 位,则为真(SUID)
chmod u+s file
chgrp stual abcd.err 改所属用户组
2)字符串测试比较 格式:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
常用的测试操作符 案例
=:字符串内容相同 (==)
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符串内容非空
\>: 字符串1大于字符串2
\<: 字符串1小于字符串2
test –n 字符串 字符串的长度非零(非空)
val=“asda”
test -n $val
echo $?
0
test –z 字符串 字符串的长度为零(为空)
var=3 var
test -z $var test -z $var
echo $? echo $?
0 1
test 字符串1 = 字符串2 字符串相等(相等)
test 字符串1 != 字符串2 字符串不等(不等)
test 字符串 \> 字符串2 字符串1大于2(大于)
\ 转义字符,是为区分输入重定向,和输出重定向
test 字符串 \< 字符串2 字符串1小于2 (小于)
Var=3 var
test -z $var test -z $var
echo $? echo $?
0 1
3)整数值比较测试 格式 只能整数值比较
格式:
[ 整数1 操作符 整数2 ]
常用的测试操作符 案例
-eq 判断是否相等 (equal)
-ge 判断是否大于等于 (greater than or equal)
-gt 判断是否大于 (greater than)
-le 判断是否小于等于 (less than or equal)
-lt 判断是否小于 (less than)
-ne 判断是否不等于 (not equal)
Var=3
Test $var -eq 1 判断是否相等
或者
[ var -eq 1] 然后echo $? 查看是否为0,0则为真
test 文件1 –ge 整数2 文件1大于等于整数2
test 文件1 –gt 整数2 文件1大于整数2
test 文件1 –le 整数2 文件1小于等于整数2
test 文件1 –lt 整数2 文件1小于整数2
test 文件1 –ne 整数2 文件1不等于整数2
4.)判断表达式
if test (表达式为真)
if test ! 表达式为假 !取反 -a 与 -o 或
test 表达式1 –a 表达式2 两个表达式都为真
test 表达式1 –o 表达式2 两个表达式有一个为真
1.算数表达式的逻辑测试
((算数表达式))
例如:
((2-1)) echo $? 0
((2-2)) echo $? 1
算数表达式的结果不为0,逻辑结果为真,($?=0),
算数表达式的结果为0,逻辑结果为“假”,($?=0),
2.逻辑测试 格式
[ 表达式1 操作符 表达式2 ] ...
常用的测试条件的逻辑操作符 案例
!逻辑非(NOT),它放在任意逻辑表达式之前,使原来的表达式由真变假,或者由假变真。
例如:
[ ! -r $1 ]
另一种写法
!test -r “$1” 这句相当于说$1的内容非可读才是真
-a 逻辑与,“而且”的意思,
前后两个表达式都成立时整个测试结果才为真,否则为假
例如:
[ -f “$myfile” -a -r “$myfile” ] $myfile即是文件又可读才是真,否则为假
-o 逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
例如:
[ “$a” -ge 0 -o “$b” -le 100] 假如$a=5整个结果就是真了。有一个为真就是真
()圆括号,把一个逻辑表达式括起来,使之优先得到运算,缺省下-a 的优先级高于-o,()可以改变这种优先级
-a 逻辑与 而且 ----两个表达式都为真
例如:
[ -f abc.err -a -d my_dir1]
文件 与 目录
或者
test -f abc.err -a -d my_dir1
test 表达式1 –a 表达式2 两个表达式都为真
[ -f abc.err -a -d my_dir1]只能在[] 里面写参数,
! 逻辑非 取反 使原来的表达式由真变假,或者由假变真。
[ -f abcd.err ] echo $? 0
[ ! -f abcd.err ] echo $? 1
-o 逻辑或 两个表达式有一个为真
test 表达式1 –o 表达式2 -----两个表达式有一个为真
[ ! \( -f abc.err -o -d my_dir1 \ ) -a -b /dev/sda]
!取反 反义
第十四天判断语句
If格式
if [ 条件判断 ];
then ---判断条件是否成立,若成立,执行代码,
格式:
[ ]; 前后必须有空格
命令块 --直接写命令,在同一行分号隔开:
fi 结束
(1)格式1判断条件 -gt lt eq ge le ne f d l b快设备 c字符设备 案例
[ $shu -gt 80 ]; -gt 大于 -lt 小于 -eq 等于 -ge 大于等于 -le 小于等于 -ne 不等于
[ $name = "zhang" ];---用 = 做字符的判断 注:=左右无空格表示赋值功能,=左右有空格表示判断功能
[ -f "/mnt/f1 " ]; --- -f判断是否是文件或文件是否存在 -d 判断目录 -l 判断软链接 -b 块设备 -c 字符设备
[ -r "/mnt/f1" ]; --- -r判断是否有读权限 -w 判断写权限 -x 判断执行权限
[ -z $shu ]; --- -z判断变量值是否为空,若为空,则判断结果成立
[ 条件1 -a 条件2 ]; --- -a表示and,即与运算 -o 表示or,即或运算
例:
[ $age -ge 20 -a $age -le 35 ];
[ ! 条件 ]; --- ! 表示取反值
案例:
read -p "Pls input Your choice(number):" var1
if [ "$var1" -gt 4 ]
then
echo "Value is out of range "
fi
(2)格式2: if then 案例
if [ 条件判断 ];
then ---条件满足执行代码1,不满足执行代码2
//代码1
else
//代码2
fi
read -p "Pls input Your choice(number):" var1
if [ "$var1" -gt 4 ];
then
echo "Value is out of range "
else
echo "you input is $var1"
fi
(3)格式3:
if [ 条件1 ];
then ---条件1满足执行代码1,
//代码1
elif [ 条件2 ];
then --- 否则,条件2满足执行代码2
//代码2
elif [ 条件3 ];
then --- 否则,条件3满足执行代码3
//代码3
else
//代码4 ---之前所有条件都不满足
Fi
注:多级判断时,判断条件的先后顺序
#先判断条件1,如果为真则执行条件elif2,3,,如果条件1为假则执行else
案例:
read -p "Pls input Your choice(number):" var1
if [ "$var1" -le 4 ];
then
echo "you input is haha"
elif [ $1 -eq 5 ]
then
echo "your input is 5"
elif [ $1 -eq 6 ]
then
echo "input is 6"
elif [ $1 -eq 7 ]
then
echo "input is 7"
else
echo "you input is out of rang"
fi
注意
[root@centos7 ss]# ./if
Pls input Your choice(number):4
you input is haha
[root@centos7 ss]# ./if 7 ---因为比4大,所以输入5是,会输入这个7
Pls input Your choice(number):5
input is 7
[root@centos7 ss]#
2.)循环语句while格式 案例
功能:重复性执行某个操作
while [ 条件判断 ]
do
命令1
命令2
....(//代码)
命令n
done
执行过程:条件=>代码=>条件=>代码=>...=>直到条件不满足
循环四要素:初值 条件 循环体 变量更新,避免:无循环 死循环
案例
1)计算1-100之间各数之和
sum=0 #----定义变量
shu=1 #----定义变量
while [ $shu -le 100 ]; #----shu小于100
do
let sum=$sum+$shu #----累加
let shu=$shu+1 #---原来值+1,再去循环是否小于100,是就接着循环
done #----表示结束
echo $sum #---输出sum
2)计算任意数的和(从1开始)
sum=0 #----初始值总和为0
shu=1 #----数为1
read -p "Pls input a number:" var #----请输入一个数 var表示任意变量
while [ $shu -le $var ]; #----比较shu是否小于等于var变量
do
let sum=$sum+$shu #sum为sum+shu ,新值
let shu=$shu+1
done
echo $sum
3)计算1-100间3的倍数之和
sum=0
shu=1
while [ $shu -le 100 ];
do
let yu=$shu%3 #--余数=shu%3
if [ $yu -eq 0 ]; then #---余数=0时,然后下一步
let sum=$sum+$shu #--接着相加,不为0时fi结束
fi
let shu=$shu+1
done
echo $sum
:字符串
jiXu="y" #--- 继续=yes
while [ $jiXu = "y" ]; #-- 条件为真
do
echo "上午上课"
echo "下午实验"
echo "晚上自习"
read -p "明天继续吗?y/n:" jiXu
done
3.)循环控制语句break 格式案例
break [n] 停止、跳出循环
continue 停止本次循环,跳入下一次循环
While [条件判断]
do m1
命令块 m2
continue 中断循环,开新的循环
m3 不运行了
done
案例
1)计算1-100之间各数之和,求加到几的时候,和超过1000
shu=1
sum=0
while [ $shu -le 100 ];
do
let sum=$sum+$shu ---循环相加求和
if [ $sum -ge 1000 ]; then
break
fi
let shu=$shu+1
done
echo shu=$shu sum=$sum
2)计算1-100间3的倍数之和
shu=1
sum=0
while [ $shu -le 100 ];
do
let yu=$shu%3
if [ $yu -ne 0 ]; ---查看余数是否不等于0
then
let shu=$shu+1
continue
fi
let sum=$sum+$shu
let shu=$shu+1
done
4.)for循环格式 案例
for 变量 in 值1 值2 值3 ... ---把后面给定的值,依次赋值给变量,带入代码执行
do
//代码
Done
缺点:for不支持做范围的指定
案例
1 )计算1-10之间各数之和
sum=0
for shu in 1 2 3 4 5 6 7 8 9 10
do
let sum=$sum+$shu
done
echo $sum
5.)多分支语句case格式 案例
case $变量 in ---根据变量的值,找到下面对应的值项,运行对应代码
值1) 代码1 ;; --- ;; 表示本项代码的结束
值2) 代码2 ;;
值3) 代码3 ;;
*) 代码4 ;; --- *项,表示给定的值与变量的值都不匹配时,执行*项
esac
案例
case $1 in
*[!0-9]* ) echo "The first is not a number" ---不是0-9,输出3
exit 3
;;
* ) echo "The first is number! value is $1" ---是数字,输出 0
exit 0
;;
esac
[root@centos7 ss]# ./zz
The first is number! value is
[root@centos7 ss]# ./zz aa2
The first is not a number
[root@centos7 ss]# ./zz 123
The first is number! value is 123
[root@centos7 ss]# echo $?
0
[root@centos7 ss]# ./zz aaa
The first is not a number
[root@centos7 ss]# echo $?
3
6.)选择语句select格式 案例
select 变量 in 值1 值2 值3 ... ---把后面给定的值,当做菜单显示,根据人为的选择,把对应的值赋值给变量,带入代码
do
//代码
break --- 跳出本结构,若不写break,则循环选择
done
特殊应用
userName=`awk -F ":" '{print $1}' /etc/passwd` ; echo $userName
注:给变量赋值时,变量值中不支持回行,多行的值,赋给变量,也是一行存储的
7.)read格式
一行内容格式案例
read hang < /mnt/f1 ---读取文档中的第一行文字,赋值给变量
[root@centos7 ss]# vi f1
bcd 1234 adas
dasdas
55566 kkss
sdkja\skd 0099 kkk
~
---------编辑f1 文件
[root@centos7 ss]# echo $f1
bcd 1234 adas ---输出第一行
全部输出 格式案例
while read hang ---逐行读取文档的内容,每次读取一行,赋值给变量,带入代码中
do
echo $hang
done < /mnt/f1
案例
[root@centos7 ss]# while read var ---输出全部
> do
> echo $var ---输出全部
> done <f1
bcd 1234 adas
dasdas
55566 kkss
sdkjaskd 0099 kkk
[root@centos7 ss]# while read var
> do
> echo $var
> echo $var |grep 555
> if [ $? -eq 0 ] ;then
> break ---Break跳出,提取
> fi
> done < f1 ----从f1 里面读取
bcd 1234 adas
dasdas
55566 kkss
55566 kkss
读取字段 格式 案例
while read c1 c2 c3 ---逐行读取文档的内容,每次读取一行,把该行的各列的值,赋值给对应的变量
do c1 c2 c3 为多个变量
echo $c2
done < /mnt/f2
案例
[root@centos7 ss]# vi f1 ---编写vi
bcd 1234 adas
dasdas
55566 kkss
sdkja\skd 0099 kkk
~
[root@centos7 ss]# while read var1 var2 var3 ---var1,var2 读取第几行
> do
> echo $var2 -----输出第二行
> done <f1 ----从f1 里面读取
1234
kkss
0099
8.)函数编写 格式 案例
函数编写---又称方法
功能:在shell脚本中,编写一段独立的代码,完成一个小功能。被正常的代码所调用
目的:被多次执行的相同代码,写到函数中,被多次调用即可,无需把代码写好多遍,简化代码量
定义格式:
当成命令来使用,不用写vi,# 下写就行
function 函数名( ) { --函数名后一定有圆括号,function关键词可省略
//代码 shell ()无东西
}
或
函数名( ){
//代码
}
( )子shell { }当前shell
定义函数后可以当命令来使用
案例
求1-n之间各数之和
function qiuHe(){ -----qiuHe是定义的函数
read -p "请输入要累加到的数字:" n
sum=0
shu=1
while [ $shu -le $n ];
do
let sum=$sum+$shu ---可以echo $sum和$shu 查看
let shu=$shu+1 当前shell可知
done
echo $sum
}
echo then is sum of 1 - n: #
qiuHe ---代码中直接写函数名,即可实现函数调用
9.)参数传递
函数在运行时,需要调用方给其提供素材性数据,以参数传递的形式完成
定义格式:
在函数代码中,以 $n 的格式使用参数,n表示编号,从1开始计数
调用格式:调用方按照函数所需参数的个数,调用时,在函数名后一一列举
案例 求和累加
function qiuHe(){
sum=0
shu=1
while [ $shu -le $1 ];
do
let sum=$sum+$shu
let shu=$shu+1
done
echo $sum
}
echo "请输入要累加到的数字"
read n
echo 1- $n 的累加和是:
qiuHe $n ---调用函数,并传递参数
案例 求减法
function qiuJianFa(){
let cha=$1-$2
echo $cha
}
echo "请输入要第一个数字"
read n1
echo "请输入要第二个数字"
read n2
qiuJianFa $n1 $n2
10.)返回值格式
函数运行完毕,携带结果数据,返回调用方
格式: 函数中,用return指定返回的值,调用方代码中,调用后,用$?的格式去使用返回值,注:返回值只能有一个
1.案例
function qiuJianFa(){
let cha=$1-$2
return $cha
}
echo "请输入要第一个数字"
read n1
echo "请输入要第二个数字"
read n2
qiuJianFa $n1 $n2
echo 两数相减的差为:$?
注意:脚本代码中函数的定义语句必须写在调用语句之前
脚本中可以编写参数调用,人为再运行脚本时,给其传递参数
2.案例.返回值
返回值 return 返回
# function fanhui (){
> if [ $1 -lt 5 ] #---如果输入的$1 小于5
> then
> echo you #---则输出 you
> return 1 #--- echo $? 查看是回复 1
> elif [ $1 -gt 10 ] #--或者 输入的$1 大于10
> then
> echo wo #--输出 wo
> return 2 #-- echo $? 查看是回复 2
> else #--其他情况则输出wbzd
> echo wbzd
> return 0 #--- echo $? 查看是回复 0
> fi # --结束
注意 # type fanhui 可查看内容
# fanhui 加数字可使用 ----定义函数可以当作命令
11.)案例 命令保存到 函数库 格式 vi .bash _profile
想要保存 保存在函数库里,
1.先写一个vi 把函数命令保存在里面: vi fu
2.然后设置权限: chmod a+x fu
3.要使每次开机运行它,
写入 vi .bash _profile
在 export PATH 下加入自己的文件
如:
. /root/fu --- . 表示当前shell /root/fu 为路径
案例
# function fanhui (){
> if [ $1 -lt 5 ] #---如果输入的$1 小于5
> then
> echo you #---则输出 you
> return 1 #--- echo $? 查看是回复 1
> elif [ $1 -gt 10 ] #--或者 输入的$1 大于10
> then
> echo wo #--输出 wo
> return 2 #-- echo $? 查看是回复 2
> else #--其他情况则输出wbzd
> echo wbzd
> return 0 #--- echo $? 查看是回复 0
> fi # --结束
vi fu
将内容写进去
然后
chmod a+x fu
vi . bash _profile在export PATH 下写入
. /root/fu
exit ---退出
然后
fanhui 5 ---$1 变量 为5