条件测试操作

条件测试是专为影响"$?"的操作,是条件转移、循环语句的基础

 

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

 

 

条件测试操作

条件测试是专为影响"$?"的操作,是条件转移、循环语句的基础

 

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

 

 

linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句的更多相关文章

  1. Shell基础(二):Shell中的数值运算、条件测试操作、使用if选择结构

    一.Shell中的数值运算 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 使用expr.$[ ].let等整数运算工具:定义变量X=1234,然后计算X与78 ...

  2. 第二十篇 Linux条件测试语句相关知识点介绍

      条件测试语句的格式如下: [ 条件表达式 ]        # 条件表达式两侧各有一个空格 按测试对象不同,条件测试语句共分为4中类型: 文件测试语句 逻辑测试语句 整数值比较语句 字符串比较语句 ...

  3. linux文件测试操作

    1.文件测试操作 返回 true 如果... -e 文件存在 -a 文件存在 这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用 -f file 是一个 regular 文件(不是目录或者 ...

  4. linux 条件测试 ******

    文件状态测试 -b filename 当filename 存在并且是块文件时返回真(返回0) -c filename 当filename 存在并且是字符文件时返回真 -d pathname 当path ...

  5. 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用

    目录 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用 21.1 read命令键盘读取变量的值 21.1.1 read常用见用法及参数 21.2 流程控制语句if 21.2 ...

  6. 四 Shell条件测试

    条件测试操作 在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作,有时也会通过与if等条件语句相结合,让我们可以方便的完成判断. 语法格式 test 选项 文件名或目录名 ...

  7. shell条件测试和流程控制

    一.条件测试操作 1.test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值 格式:test 表达式 2.常见的测试类型 ①测试文件状态 格式:[ 操作符 文件 ...

  8. Linux:Day6(上) egrep、条件测试

    egrep及扩展的正则表达式: egrep = grep -E 扩展正则表达式的元字符: 或者:a | b 练习: 1.显示当前系统root.centos或user1用户的默认shell和UID: 2 ...

  9. Shell编程中的条件判断(条件测试)

    Shell中的条件判断(测试)类型: 1) 整数测试 2) 字符测试 3) 文件测试 条件测试的表达式:        (注: expression 与 [] 之间空格不能省略) [ expressi ...

  10. Linux Shell 03 条件测试

    条件测试 方式一:在Bash中 test命令和[]是等价的. test命令: if test $n1 -eq $n2 then echo "The two number are equal& ...

随机推荐

  1. ABP理论学习之数据传输对象(DTO)

    返回总目录 本篇目录 为何需要DTO 领域层抽象 数据隐藏 序列化和懒加载问题 DTO惯例和验证 DTO和实体的自动映射 使用特性和扩展方法进行映射 帮助接口 DTO用于应用层和 展现层间的数据传输. ...

  2. .net session_end

    在做asp.net编程开发的时候,我遇见这样的问题,一个用户只能在一台机器上登录, 如果有用户在其他机器上登录,系统将提示该用户已经登录!当前登陆非法!我的做法是: 用Application变量保存已 ...

  3. C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝

    关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符摘要:    在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作.    如果对象在申明的同时马上进行的初始化操作 ...

  4. ASCII、ANSI、GB2312、Unicode、UTF-8之间的关系

    1.ASCII码: ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统.它主要用于 ...

  5. MapReduce 规划 系列的12 使用Hadoop Streaming技术集成newLISP文字

    本文example6环境与前Hadoop 1.x异,于Hadoop 2.x环境测试. 功能与前面相同的日志处理程序. 第一newLISP文字,游玩mapper任务.于stdin读取文本数据,将did由 ...

  6. c++编程思想(二)--对象的创建和使用

    1.解释器:将源码转换为动作(机器语言),并立即执行 编译器:编译器也会将源码转换为机器语言,但是中间会经过好多步骤,分段编译 ,然后链接,可以实现将代码模块化 2.c++不鼓励多使用预处理命令 3. ...

  7. node.js爬虫爬取拉勾网职位信息

    简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳.杭州.西安.成都7个城市的数据,分别以前端.PHP.java.c++.python.Androi ...

  8. (中级篇 NettyNIO编解码开发)第七章-java序列化

    相信大多数Java程序员接触到的第一种序列化或者编解码技术就是.Java的默认序列化,只需要序列化的POJO对象实现java.io.Serializable接口,根据实际情况生成序列ID,这个类就能够 ...

  9. windows平台安装并使用MongoDB

    下载并安装MongoDB,我的安装路径:D:\Program_Files\MongoDB 创建数据库目录,我的目录:D:\mongodb\data\db 命令行下运行MongoDB服务器: 在命令行窗 ...

  10. PyCharm引入python需要使用的包

    在学习python的时候,被推荐了使用PyCharm这款IDE,但是在import包的时候却发生了问题- -无法找到相应的包,但是明明通过pip安装成功了 在这款IDE中,要导入包,需要手动进行引入 ...