shell编程 if_linux shell if语句

2022-09-23 21:20:14 浏览数 (1)

一、shell编程中条件表达式的使用

if  #条件 then Command else   Command fi   #别忘了这个结尾

如果if语句忘了结尾fi test.sh: line 14: syntax error: unexpected end of fi

二、if 的三种条件表达式

1.命令执行成功,等于返回0(比如grep ,找到匹配);执行失败,返回非0(grep,没找到匹配) if command then

if 函数 then

2.表达式结果为真,则返回0,if把0值引向then if [ expression_r_r_r  ]    #方括号前后要有空格 then 

3. 表达式结果为假,则返回非0,if把非0值引向then if test expression_r_r_r then

三、[ ]&&  ——快捷if

[ -f”/etc/shadow” ] && echo “This computer uses shadowpasswors” && 可以理解为then,如果左边的表达式为真则执行右边的语句。

四、shell的if与c语言if的功能上的区别

shell if:0为真,接着走then。不支持整数变量直接if [ i ],必须是if [ i –ne 0 ];但支持字符串变量直接if,如if [ str ],如果字符串非0则走then。

c语言if:正好相反,非0走then。支持变量直接if ( i )。

五、以多条command或者函数作为if条件

echo –n “input:” read user

if    #多条指令,这些命令之间相当于“and”(与) grep $user /etc/passwd >/tmp/null   who -u | grep $user then    #上边的指令都执行成功,返回值$?为0,0为真,运行then  echo “$user has logged” else     #指令执行失败,$?为1,运行else                              echo “$user has not logged” fi 

# sh test.sh input : macg macg     pts/0        May1515:55   .          2075(192.168.1.100) macg has logged # sh test.sh input : ddd ddd has not logged

六、以函数作为if条件  (函数就相当于command,函数的优点是其return值可以自定义)

if    #以函数作为if条件 getyn then    #函数reture值0为真,走then echo ” your answer is yes” else    #函数return值非0为假,走else echo “your anser is no” fi

七、ifcommand  等价于command if $?

例1:

$ vi testsh.sh #!/bin/sh if cat 111-tmp.txt | grep ting1 then   echo “found” else   echo “no found” fi

$ sh testsh.sh no found

$ vi 111-tmp.txt that is 222file thisting1 is 111file

$ sh testsh.sh thisting1 is 111file found

例2:

$ vi testsh.sh #!/bin/sh cat 111-tmp.txt | grep ting1 if [ $? -eq 0 ] then echo $?   echo “found” else   echo $?   echo “no found” fi

$ sh testsh.sh 1 no found

$ vi 111-tmp.txt that is 222file thisting1 is 111file

$ sh testsh.sh thisting1 is 111file 0 found

八、   条件表达式

1.文件表达式

if [ -f  file]    如果文件存在 if [ -d …   ]    如果目录存在 if [ -s file  ]    如果文件存在且非空  if [ -r file  ]    如果文件存在且可读 if [ -w file  ]    如果文件存在且可写 if [ -x file  ]    如果文件存在且可执行

2.整数变量表达式

if [ int1 -eq int2]    如果int1等于int2    if [ int1 -ne int2 ]    如果不等于     if [ int1 -ge int2 ]    如果>= if [ int1 -gt int2 ]     如果> if [ int1 -le int2 ]     如果<= if [ int1 -lt int2 ]      如果<

3.字符串变量表达式

if  [ $a = $b]         如果a等于b,字符串允许使用赋值号做等号 if  [ $a !=  $b ]      如果a不等于b if  [ -n $a ]             如果a非空(非0),返回0(true)   if  [ -z $a  ]            如果a为空 if  [ $a]                 如果a非空,返回0(和-n类似)

4.-eq  -ne  -lt  -nt只能用于整数,不适用于字符串,字符串等于用赋值号=。同时由于shell里没有> 和< ,会被当作尖括号,整数条件表达式只有-ge, -gt,-le, lt。

5.=放在别的地方是赋值,放在if [ ]里就是字符串等于,shell里面没有==的,那是c语言的等于。

6.= 作为等于时,其两边都必须加空格,否则失效!!!等号也是操作符,必须和其他变量,关键字,用空格格开(等号做赋值号时正好相反,两边不能有空格!!!)

例:

$ vi test.sh echo “input your choice:” read var if [ $var=”yes” ] then  echo$var   echo”input is correct” else   echo$var   echo “input error” fi

$ sh test.sh input your choice: yes yes input is correct

$ sh test.sh input your choice: n n input is correct  输错了也走then,都走then,为什么? 因为if把$var=”yes”连读成一个变量,而此变量为空,返回1,则走else。

7.if  [  $ANS  ]等价于if [-n $ANS ]。如果字符串变量非空(then),空(else)。

九、逻辑表达式

1.逻辑非!                   条件表达式的相反 if [ ! 表达式 ] if [ ! -d $num]                        如果不存在目录$num

2.逻辑与–a                    条件表达式的并列 if [ 表达式1  –a  表达式2 ]

3.逻辑或-o                    条件表达式的或 if [ 表达式1  –o表达式2 ]

4.逻辑表达式补充说明

·        表达式与前面的=  != -d –f –x -ne -eq -lt等合用

·        逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列 if [ -z “$JHHOME” -a -d $HOME/$num ]

·        注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了

十、以  test 条件表达式 作为if条件

if test $num -eq 0 等价于 if[ $num –eq 0 ] test  表达式,没有[  ]

if test $num -eq0                 then   echo “try again” else   echo “good” fi

$ man test [(1)                             UserCommands                            [(1) SYNOPSIS        test EXPRESSION        [ EXPRESSION ]        [-n] STRING               thelength of STRING isnonzero          -n和直接$str都是非0条件        -z STRING               thelength of STRING is zero        STRING1 = STRING2               thestrings are equal        STRING1 != STRING2               thestrings are not equal        INTEGER1 -eq INTEGER2               INTEGER1is equal to INTEGER2        INTEGER1 -ge INTEGER2               INTEGER1is greater than or equal to INTEGER2        INTEGER1 -gt INTEGER2               INTEGER1is greater than INTEGER2        INTEGER1 -le INTEGER2               INTEGER1is less than or equal to INTEGER2        INTEGER1 -lt INTEGER2               INTEGER1is less than INTEGER2        INTEGER1 -ne INTEGER2               INTEGER1is not equal to INTEGER2        FILE1 -nt FILE2               FILE1is newer (modification date) than FILE2        FILE1 -ot FILE2               FILE1is older than FILE2        -b FILE               FILEexists and is block special        -c FILE               FILEexists and is character special        -d FILE               FILEexists and is a directory        -e FILE               FILEexists                                 文件存在        -f FILE               FILEexists and is a regular file     文件存在且是普通文件        -h FILE               FILEexists and is a symbolic link (same as -L)        -L FILE               FILEexists and is a symbolic link (same as -h)        -G FILE               FILEexists and is owned by the effective group ID        -O FILE               FILEexists and is owned by the effective user ID        -p FILE               FILEexists and is a named pipe        -s FILE               FILEexists and has a size greater than zero        -S FILE               FILEexists and is a socket        -w FILE               FILEexists and is writable        -x FILE FILE exists and is executable

十一、if简化语句

最常用的简化if语句

1.  &&如果是“前面”,则“后面” [ -f /var/run/dhcpd.pid ] && rm/var/run/dhcpd.pid    检查文件是否存在,如果存在就删掉

2.  ||  如果不是“前面”,则”后面” [ -f /usr/sbin/dhcpd ] || exit 0    检验文件是否存在,如果存在就退出

3.   用简化 if 和$1,$2,$3来检测参数,不合理就调用help [ -z “$1” ] &&help                 如果第一个参数不存在(-z  字符串长度为0 ) [ “$1” = “-h” ] &&help                        如果第一个参数是-h,就显示help

0 人点赞