Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
Linux shell程序设计(六).控制结构-1
 
    开始进入变成的实质性部分——语句结构。其中的if语句的复杂度超过了我的想象,特别是那几个不同的种类,需要好好研究研究。
 
 
一、if语句
 
1、 测试语句条件
 
    if 测试语句
    then 命令1
    else 命令2
    fi
 
    举例:
    if test -f "$1"
    then pr $1
    elif test -d "$1"
    then (cd $1 ; pr *)
    else echo "$1 is neither a file nor a directory."
    fi
    说明:如果$1是一个普通文件名,则打印其内容,如果$1是一个文件夹地址,则打印其下所有文件的内容,如果均不是,则显示错误信息。
 
2、命令语句条件
 
    通常if语句都用test命令测试,但是也可以利用一般命令执行成功与否来做判断。
    如果执行成功,则返回0,if条件为真;否则为假。
 
    if 命令表1
    then 命令表2
    else 命令表3
    fi
 
    举例:
    if
      grep $user /etc/passwd > /tmp/null
      who | grep $user
    then
      echo "$user has logged in the system."
      cp /tmp/null tmp1
      rm /tmp/null
    else
      echo "$user has not logged in the system."
    fi
    说明:如果输入用户已经注册,则将信息写入tmp1中,若未注册则返回错误信息。
 
 
二、条件测试
 
    条件测试有3中形式:
 
    ① 用test命令 --test -f "$1"
    ② 用[]括起来([]里面必须要有空格) --[ -f "$1"]
    ③ 用[[条件表达式]]的格式
 
    test命令可以和多种系统运算符一起使用,主要包括以下几类:
 
1、文件类测试
 
    ① -r 文件名:文件存在且可读,则返回true
    ② -w 文件名:文件存在且可写,则返回true
    ③ -x 文件名:文件存在且可执行,则返回true
    ④ -f 文件名:文件存在且为普通文件,则返回true
    ⑤ -d 文件名:文件存在且为目录文件,则返回true
    ⑥ -p 文件名:文件存在且为命名的FIFO文件,则返回true
    ⑦ -b 文件名:文件存在且是块设备文件,则返回true
    ⑧ -c 文件名:文件存在且是字符设备文件,则返回true
    ⑨ -s 文件名:文件存在且长度大于0,则返回true
    ⑩ -t 描述字:若文件被打开且描述字与终端设备相关,则返回true(默认描述字为1)
 
2、字符串测试
 
    ① -z s1:若字符串s1长度为0,则返回true
    ② -n s1:若字符串s1长度大于0,则返回true
    ③ s1:若字符串s1存在且部位空,则返回true
    ④ s1 = s2:若s1、s2相等,则返回true(“=”可以用“==”代替,“=”前后必须有空格)
    ⑤ s1 != s2:若s1、s2不相等,则返回true
    ⑥ s1 < s2:若按字典顺序s1在s2之前,则返回true
    ⑦ s1 > s2:若按字典顺序s1在s2之画后,则返回true

3、数值测试
 
    ① n1 -eq n2:若n1等于n2,则返回true
    ② n1 -ne n2:若n1不等于n2,则返回true
    ③ n1 -lt n2:若n1小于n2,则返回true
    ④ n1 -le n2:若n1小于等于n2,则返回true
    ⑤ n1 -gt n2:若n1大于n2,则返回true
    ⑥ n1 -ge n2:若n1大于等于n2,则返回true

4、逻辑运算符
 
    逻辑运算符是用于将以上测试语句组合起来的符号
 
    ① !:逻辑非,放在表达式的最前面,使表达式最终结果相反。
    ② -a:逻辑与,放在两个表达式之间 &&
    ③ -o:逻辑或,放在两个表达式之间 ||
    ④ ():用于划分逻辑运算
    举例:
    [ ! -r $1 ]
    !test -r "$1"
    [ -f "$myfile" -a -r "$myfile" ]
    [ "$a" -ge 0 -o "$b" -le 100 ]
    [ \( "$a" -ge 0 -o "$b" -le 100 \) -a "$c" -eq 10 ]
 
    优先级:
    表达式 > () > ! > -a > -o
 
5、特殊条件测试
 
    ① “:”:表示不做任何事情,退出值为0
    ② true:表示总为真,退出值为0
    ③ false:表示总为假,退出值为255
 
    举例:
 
    echo "Enter two numbers"
    read x y
    ((z=x+y))
    if [[ z -gt 10 ]]
    then
      echo "x+y>10"
    fi
    ((x*=y))
    ((z%=5))
    if [[ x -le 100 || z -ne 0 ]]
    then
      echo "x*y<=100 or (x+y)%5!=0"
    fi
    echo "Your current directory is `pwd`"
    echo "Enter a file name ->\c"
    read name
    if [[ -r $name && -f $name ]]
    then
      cat $name
    elif [[ -d $name && -x $name ]]
    then
      cd $name
      ls -l | wc -l
    else
    echo "Bad file name!"
    fi
 
 
三、case语句
 
    语法格式为:
 
    case 字符串 in    
    s1) 命令          
        ...           
        命令;;        
    s2) 命令          
        ...           
        命令;;        
    s3) 命令          
        ...           
        命令;;        
    esac              
 
    举例如下:
 
    echo "Please chose either a,b or c"
    echo "[a] print a file"
    echo "[b] delete a file"
    echo "[c] quit"
    read response
    case $response in
    a) lp myfile;;
    b) rm myfile;;
    c) echo "Good bye";;
    esac
 
    注意事项:
 
    ① 一个case可以跟多条命令,最后一个命令必须以“;;”结尾
    ② 模式字符串可以使用通配符,例如“*)”
    ③ 如果几个case相同处理,则用“|”隔开,表示“或”的意思
    ④ 各个case之间不能重复,且需要考虑先后位置
    ⑤ 以case关键字开头,以esac关键字结尾
    ⑥ case的退出值是最后一个命令执行的退出值,如未执行任何命令,则退出值为0
 
 
posted on 2009-01-11 21:35 decode360 阅读(152) 评论(0)  编辑  收藏 所属分类: 03.Linux

只有注册用户登录后才能发表评论。


网站导航: