shell的if语句

$?:表示函数命令的返回结果

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

等号作为判断操作符,必须和其他变量,关键字,用空格格开 (等号做赋值号时正好相反,两边不能有空格) 

    If  [  $ANS  ]    等价于  if [ -n $ANS ] 

      如果字符串变量非空则(then) 空则(else) 

shellif语句

  –b file存在并且是块文件时返回真 

 

  -c file存在并且是字符文件时返回真 

 

  -d pathname存在并且是一个目录时返回真 

 

  -e pathname指定的文件或目录存在时返回真 

 

  -f file存在并且是正规文件时返回真 

 

  -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 

 

  -h file存在并且是符号链接文件时返回真,该选项在一些老系统上无效 

 

  -k 当由pathname指定的文件或目录存在并且设置了粘滞位时返回真 

 

  -p file存在并且是命令管道时返回为真 

 

  -r 当由pathname指定的文件或目录存在并且可读时返回为真 

 

  -s file存在文件大小大于0时返回真 

 

  -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真 

 

  -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容

被访问必然是可执行的。 

 

  -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用

户拥有时返回真。 

 

  UNIX Shell 里面数字比较写法: 

 

  -eq   等于 (数字)

 

  -ne    不等于 

 

  -gt    大于 

 

  -lt    小于 

   -le    小于等于 

 

  -ge   大于等于 

 

  -z    空串 

 

  =    两个字符相等 (字符等)

 

  !=    两个字符不等 

 

  -n    非空串 

 

  ------------------------------------------------------------------------- 

 

  更为详细的说明: 

 

  运算符                     描述                          示例 

 

  文件比较运算符 

 

  -e filename     如果 filename 存在,则为真            [ -e /var/log/syslog ] 

 

  -d filename     如果 filename 为目录,则为真          [ -d /tmp/mydir ] 

 

  -f filename     如果 filename 为常规文件,则为真      [ -f /usr/bin/grep ] 

 

  -L filename     如果 filename 为符号链接,则为真      [ -L /usr/bin/grep ] 

 

  -r filename     如果 filename 可读,则为真            [ -r /var/log/syslog ] 

 

  -w filename     如果 filename 可写,则为真            [ -w /var/mytmp.txt ] 

 

  -x filename     如果 filename 可执行,则为真          [ -L /usr/bin/grep ] 

 

  filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 

[ /tmp/install/etc/services -nt /etc/services ] 

 

  filename1 -ot filename2   如果 filename1 比 filename2 旧,则为真  [ /boot/bzImage -ot 

arch/i386/boot/bzImage ] 

 

  字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法) 

 

  -z string               如果 string 长度为零,则为真               [ -z $myvar ] 

   -n string             如果 string 长度非零,则为真        [ -n $myvar ] 

 

  string1 = string2         如果 string1 与 string2 相同,则为真     [ $myvar = one 

two three ] 

 

  string1 != string2        如果 string1 与 string2 不同,则为真     [ $myvar != one 

two three ] 

 

  算术比较运算符 

 

  num1 -eq num2              等于         [ 3 -eq $mynum ] 

 

  num1 -ne num2              不等于       [ 3 -ne $mynum ] 

 

  num1 -lt num2               小于        [ 3 -lt $mynum ] 

 

  num1 -le num2            小于或等于     [ 3 -le $mynum ] 

 

  num1 -gt num2             大于          [ 3 -gt $mynum ] 

 

  num1 -ge num2             大于或等于    [ 3 -ge $mynum ] 

 

  脚本示例: 

 

  #!/bin/bash 

 

  # This script prints a message about your weight if you give it your 

 

  # weight in kilos and hight in centimeters. 

 

  if [ ! $# = 2 ]; then# $# 表示传递给脚本的参数个数

 

  echo "Usage: {GetProperty(Content)} weight_in_kilos length_in_centimeters" 

  exit 

 

  fi 

 

  weight="{GetProperty(Content)}" 

 

  height="$2" 

   idealweight=$[$height - 110] 

 

  if [ $weight -le $idealweight ] ; then 

 

  echo "You should eat a bit more fat." 

 

  else 

 

  echo "You should eat a bit more fruit." 

 

  fi 

 

  # weight.sh 70 150 

 

  You should eat a bit more fruit. 

 

  # weight.sh 70 150 33 

 

  Usage: ./weight.sh weight_in_kilos length_in_centimeters 

 

  位置参数 {GetProperty(Content)}, $2,..., $N$#代表了命令行的参数数量, 

{GetProperty(Content)}代表了脚本的名字, 

 

  第一个参数代表{GetProperty(Content)},第二个参数代表$2,以此类推,参数数量的总

数存在$#中,上面的例子显示了怎么改变脚本,如果参数少于或者多余2个来打印出一条消

息。 

 

  执行,并查看情况。 

 

  # bash -x tijian.sh 60 170 

 

  + weight=60 

 

  + height=170 

 

  + idealweight=60 

 

  + '[' 60 -le 60 ']' 

 

  + echo 'You should eat a bit more fat.' 

 

  You should eat a bit more fat. 

 

  其中-x用来检查脚本的执行情况 if 语句格式

if语句

if  条件 

then 

 Command 

else 

 Command 

fi                              别忘了这个结尾 

  

if语句忘了结尾fi 

test.sh: line 14: syntax error: unexpected end of fi 

  

 

 if 的三种条件表达式 

if   command 

then 

fi

 

if 函数 

then 

  函数执行成功,等于返回(比如grep ,找到匹配),注意对于命令函数来说返回0就是真,执行then

if

if test expression_r_r_r 

then 

 如果表达式expression_r_r_r 为真,那么test的结果返回0,所以执行then

if

test命令等价于[]

所以上面的语句等价于:

if  [ expression_r_r_r ] 

then 

 如果表达式expression_r_r_r 为真,那么test的结果返回0,所以执行then

if

上面语句也等价于:       

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors" 

 如果左边的表达式为真则执行右边的语句 

   (&&  可以理解为then) 

  

 

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

echo –n “input:” 

read user 

#多条指令,这些命令之间相当于“and”(与) 

if 

grep $user /etc/passwd >/tmp/null       

who -u | grep $user 

then             #上边的指令都执行成功,返回值$?00为真,运行then 

 echo "$user has logged" 

else             # 指令执行失败,$?1,运行else                             

 echo "$user has not logged" 

fi    

  

# sh test.sh 

input : macg 

macg     pts/0        May 15 15:55   .          2075 (192.168.1.100) 

macg has logged 

    

# sh test.sh 

input : ddd 

ddd has not logged   

  

 

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

if 

getyn       #getyn 是函数

then   #函数reture0为真,走then 

echo " your answer is yes" 

else   #函数return值非0为假,走else 

echo "your anser is no" 

fi   

  

 以命令作为if条件  

1)编写vi命令文本testsh.sh ,vi内容如下

cat 111-tmp.txt | grep ting1 

then 

echo found 

else 

echo "no found" 

fi 

2)也可以这样编写vi命令文本testsh.sh和方法1)是一样的命令

cat 111-tmp.txt | grep ting1 

if [ $? -eq 0 ] 

then 

echo $? 

echo found 

else 

echo $? 

echo "no found" 

fi  

  

3)执行编写好的命令testsh.sh

 31)直接执行命令(没有建立文本111-tmp.txt)

$ sh testsh.sh 

#结果如下

no found  

32)先编写文本111-tmp.txt 在执行命令testsh.sh

 $ vi 111-tmp.txt 

that is 222file 

thisting1 is 111file 

$ sh testsh.sh 

thisting1 is 111file 0 

found  

 

======================================以条件表达式作为 if条件

 

    if [ 条件表达式 

then 

 command 

 command 

 command 

else 

 command 

 command 

fi 

    

   条件表达式 

 

 

文件表达式  

if [ -f  file ]    如果文件存在 为真

if [ -d ...   ]    如果目录存在 

if [ -s file  ]    如果文件存在且非空  

if [ -r file  ]    如果文件存在且可读 

if [ -w file  ]    如果文件存在且可写 

if [ -x file  ]    如果文件存在且可执行    

 

整数变量表达式  

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 ]       如果

    

 

   字符串变量表达式  

If  [ $a = $b ]                 如果string1等于string2  为真

                                字符串允许使用赋值号做等号 

if  [ $string1 !=  $string2 ]   如果string1不等于string2        

if  [ -n $string  ]             如果string 非空(0),返回0(true)   

if  [ -z $string  ]             如果string 为空 

if  [ $sting ]                  如果string 非空,返回0 (-n类似)      

条件表达式引用变量要带

if [ a = b ] ;then   //这里一定是假,缺少了引用$符号  

echo equal 

else 

echo no equal 

fi 

  

  

  

                                                                                    

 

无空格的字符串,可以加" ",也可以不加  注意这里

[macg@machome ~]$ vi test.sh 

echo "input a:" 

read a 

echo "input is $a" 

if [ $a = 123 ] ; then 

echo equal123 

fi 

  

[macg@machome ~]$ sh test.sh 

input a: 

123 

input is 123 

equal123  

  

  在等号两边加空格 

[macg@machome ~]$ 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 

 [macg@machome ~]$ 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  

[macg@machome ~]$ sh test.sh 

input your choice: 

input is correct 

[macg@machome ~]$ sh test.sh 

input your choice: 

n     

input is correct  

输错了也走then,都走then,为什么

因为if$var="yes"连读成一个变量,而此变量为空,返回1,则走else  [macg@machome 

~]$ sh test.sh 

input your choice: 

input error 

[macg@machome ~]$ sh test.sh 

input your choice: 

no                        

no 

input error 

一切正常 

  

 If  [  $ANS  ]    等价于  if [ -n $ANS ] 

      如果字符串变量非空(then) (else) 

  

  

 整数条件表达式,大于,小于,shell里没有< ,会被当作尖括号,只有-ge,-gt,-le,lt 

[macg@machome ~]$ vi test.sh 

echo "input a:" 

read a 

if  [ $a -ge 100 ] ; then 

echo 3bit 

else 

echo 2bit 

fi 

  

[macg@machome ~]$ sh test.sh 

input a: 

123 

3bit 

[macg@machome ~]$ sh test.sh 

input a: 

20 

2bit 

  

 

 整数操作符号-ge,-gt,-le,-lt, 别忘了加

if  test $a  ge 100 ; then 

 

[macg@machome ~]$ sh test.sh 

test.sh: line 4: test: ge: binary operator expected 

  

if  test $a -ge 100 ; then 

 

[macg@machome ~]$ sh test.sh 

input a: 

123 

3bit 

  

 

============================逻辑表达式

========================================= 

 

    逻辑非 !                   条件表达式的相反 

if [ ! 表达式 ] if [ ! -d $num ]                        如果不存在目录$num 

 

 

    逻辑与 –a                    条件表达式的并列 

if [ 表达式1  –a  表达式2 ] 

 

 

    逻辑或 -o                    条件表达式的或 

if [ 表达式1  –o 表达式2 ] 

 

   逻辑表达式 

 

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

    逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列  

if [ -z "$JHHOME" -a -d $HOME/$num ] 

 

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

  最常见的赋值形式,赋值前对=两边的变量都进行评测 

左边测变量是否为空,右边测目录()是否存在(值是否有效) 

   

[macg@mac-home ~]$ vi test.sh 

echo "input the num:" 

read num 

echo "input is $num" 

 

if [ -z "$JHHOME" -a -d $HOME/$num ]   如果变量$JHHOME为空,且$HOME/$num目录

存在 

then 

JHHOME=$HOME/$num                      则赋值 

fi 

 

echo "JHHOME is $JHHOME"   

  

----------------------- 

[macg@mac-home ~]$ sh test.sh 

input the num: 

ppp 

input is ppp 

JHHOME is 

 

目录-d $HOME/$num   不存在,所以$JHHOME没被then赋值 

  

[macg@mac-home ~]$ mkdir ppp [macg@mac-home ~]$ sh test.sh 

input the num: 

ppp 

input is ppp 

JHHOME is /home/macg/ppp  

 

    一个-o的例子,其中却揭示了”=”必须两边留空格的问题 

echo "input your choice:" 

read ANS 

 

if [ $ANS="Yes" -o $ANS="yes" -o $ANS="y" -o $ANS="Y" ] 

then 

ANS="y" 

else 

ANS="n" 

fi 

 

echo $ANS 

  

[macg@machome ~]$ sh test.sh 

input your choice: 

[macg@machome ~]$ sh test.sh 

input your choice: 

no 

为什么输入不是yes,结果仍是y(then) 

因为=被连读了,成了变量$ANS="Yes",而变量又为空,所以走else了  

 

[macg@machome ~]$ vi test.sh 

 

echo "input your choice:" 

read ANS    echo "input your choice:" 

read ANS 

 

if [ $ANS = "Yes" -o $ANS = "yes" -o $ANS = "y" -o $ANS = "Y" ] 

then 

ANS="y" 

else 

ANS="n" 

fi 

 

echo $ANS   

[macg@machome ~]$ sh test.sh 

input your choice: 

no 

[macg@machome ~]$ sh test.sh 

input your choice: 

yes 

[macg@machome ~]$ sh test.sh 

input your choice: 

  

 

===================以  test 条件表达式作为if条件

=================================== 

    if test $num -eq 0      等价于   if [ $num –eq 0 ] 

    test  表达式,没有 [  ] 

if test $num -eq 0                 

then 

echo "try again" 

else 

echo "good" 

fi 

 

    man test 

[macg@machome ~]$ man test 

[(1)                             User Commands                            [(1) 

 

SYNOPSIS 

       test EXPRESSION 

       [ EXPRESSION ] 

 

 

       [-n] STRING 

              the length of STRING is nonzero          -n和直接$str都是非0条件 

 

       -z STRING 

              the length of STRING is zero 

 

       STRING1 = STRING2 

              the strings are equal 

        STRING1 != STRING2 

              the strings are not equal 

 

       INTEGER1 -eq INTEGER2 

              INTEGER1 is equal to INTEGER2 

 

       INTEGER1 -ge INTEGER2 

              INTEGER1 is greater than or equal to INTEGER2 

 

       INTEGER1 -gt INTEGER2 

              INTEGER1 is greater than INTEGER2 

 

       INTEGER1 -le INTEGER2 

              INTEGER1 is less than or equal to INTEGER2 

 

       INTEGER1 -lt INTEGER2 

              INTEGER1 is less than INTEGER2 

 

       INTEGER1 -ne INTEGER2 

              INTEGER1 is not equal to INTEGER2 

 

       FILE1 -nt FILE2 

              FILE1 is newer (modification date) than FILE2 

 

       FILE1 -ot FILE2 

              FILE1 is older than FILE2 

 

       -b FILE 

              FILE exists and is block special 

 

       -c FILE 

              FILE exists and is character special 

 

       -d FILE 

              FILE exists and is a directory 

 

       -e FILE 

              FILE exists                                 文件存在 

 

       -f FILE 

              FILE exists and is a regular file     文件存在且是普通文件 

 

       -h FILE 

              FILE exists and is a symbolic link (same as -L)  

       -L FILE 

              FILE exists and is a symbolic link (same as -h) 

 

       -G FILE 

              FILE exists and is owned by the effective group ID 

 

       -O FILE 

              FILE exists and is owned by the effective user ID 

 

       -p FILE 

              FILE exists and is a named pipe 

 

 

       -s FILE 

              FILE exists and has a size greater than zero 

 

       -S FILE 

              FILE exists and is a socket 

 

       -w FILE 

              FILE exists and is writable 

 

       -x FILE 

FILE exists and is executable 

  

  

 

======================if简化语句================================= 

 

    最常用的简化if语句 

   && 如果是前面,则后面” 

[ -f /var/run/dhcpd.pid ] && rm /var/run/dhcpd.pid    检查 文件是否存在,如果存在就删掉 

  

   ||   如果不是前面,则后面 

[ -f /usr/sbin/dhcpd ] || exit 0    检验文件是否存在,如果不存在就退出 

  

  

    用简化 if $1,$2,$3来检测参数,不合理就调用help 

[ -z "$1" ] && help                 如果第一个参数不存在(-z  字符串长度为,help 

[ "$1" = "-h" ] && help              如果第一个参数是-h,就显示help 

 

 

例子 #!/bin/sh 

 

[ -f "/etc/sysconfig/network-scripts/ifcfg-eth0" ] && rm -f 

/etc/sysconfig/network-scripts/ifcfg-eth0 

cp ifcfg-eth0.bridge /etc/sysconfig/network-scripts/ifcfg-eth0 

 

[ -f "/etc/sysconfig/network-scripts/ifcfg-eth1" ] && rm -f 

/etc/sysconfig/network-scripts/ifcfg-eth1 

cp ifcfg-eth1.bridge /etc/sysconfig/network-scripts/ifcfg-eth1 

 

[ -f "/etc/sysconfig/network-scripts/ifcfg-eth0:1" ] && rm -f 

/etc/sysconfig/network-scripts/ifcfg-eth0:1 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值