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 _profileexport  PATH 下写入

 

 

.  /root/fu      

 

exit  ---退出

然后

fanhui   5           ---$1 变量 为5

 

posted @ 2020-07-31 18:46  浅唱I  阅读(579)  评论(0编辑  收藏  举报