Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4241939
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: LINUX

2011-01-18 10:50:01

在本节中,我们学到:
if     elif    for  while until case AND列表 OR列表

-a 逻辑与,操作符两边均为真,结果为真,否则为假
-o 逻辑或,操作符两边一边为真,结果为真
! 逻辑否,条件为假,结果为真

  1. ywx@ywx:~/desktop/linux_shell$ [ "999" -lt "1000" -a "232" -lt "1236" ]
  2. ywx@ywx:~/desktop/linux_shell$ echo $?
  3. 0                  返回0 表示正确



1. if 语句

  1. if condition
  2. then
  3.    statement
  4. else
  5.    statement
  6. fi

例子
  1. #!/bin/sh

  2. echo "is it morning ? please answer yes or no"
  3. read timeofday

  4. if [ $timeofday = "yes" ] #注意空格 这里是“=”    而不是“==
  5. then
  6.      echo "good mornign"
  7. else
  8.     echo "good afternoon"
  9. fi

  10. # 也可以这么写
  11. # if [ $timeofday="yes" ];then
  12. # echo "good morning"



2.elif 语句
  1. if conditon
  2. then
  3.     ....

  4. elif
  5. then
  6.     ....
  7. else

  8. fi

  1. #!/bin/sh

  2. echo "is it morning ? please answer yes or no"
  3. read timeofday

  4. if [ $timeofday = "yes" ] #注意空格 这里 是“=”而不是“==
  5. then
  6.      echo "good mornign"     #注意每一个
  7. elif [ $timeofday = "no" ]
  8. then
  9.     echo "good afternoon"
  10. else
  11.     echo "sorry, $timeofday not recognized. enter yes or no"
  12.     exit 1
  13. fi

  14. exit 0

3.一个于变量有关的问题
   前面的程序有个致命错误,运行这个脚本程序,但是这次不回答问题,犹如下的错误
  
  

   哪里出现问题了呢??
  
   问题就在第一个 if  语句中。在对变量timeofday进行测试时,它包含一个空字符串,这使得if语句成为如下
  
  1. if [ = "yes" ]
这不是一个合法的条件。解决方法
 
  1. if [ "$timeofday = "yes"" ]
这样,一个空变量就合法了

  1.    如果你想让echo命令去掉每一行后面的换行符,可移植性最好的办法是使用printf命令,而不是echo命令。有的shell中用echo-e命令来完成这个任务,但并不是所有的系统都支持这个命令。bash中使用
  2. echo-e命令取出换行符,所以如果确信自己的脚本程序运行在bash中你可以使用。
  3. echo -n “is it morning ? please answer yes or no”
  4. 在echo后留一个空格,echo -n 看起来更加的整齐

  1. #!/bin/sh

  2. echo -n "is it morning ? please answer yes or no"
  3. read timeofday

  4. if [ "$timeofday" = "yes" ] #注意空格 这里 是“=”而不是“==
  5. then
  6.      echo -n "good mornign" #去除换行符
  7. elif [ "$timeofday" = "no" ]
  8. then
  9.     echo -n "good afternoon"
  10. else
  11.     echo -n "sorry, $timeofday not recognized. enter yes or no"
  12.     exit 1
  13. fi

  14. exit 0
注意到:当我们加上 -n 后,没有换行了,



4 for语句
    语法如下:
   
  1. for variable in vaulue
  2. do
  3.     statement
  4. done
举例如下:
  1. #!/bin/sh

  2. for foo in bar fud 43
  3. do
  4. echo $foo
  5. done
  6. exit 0


 当我们修改  for foo in bar “fud 43”,加上引号等于告诉我们shell把引号之间的一切东西看作一个字符串




实验解析:创建了一个变量foo ,然后在for循环里每次给他赋予一个不同的值。
因为shell在默认情况下认为所有变量包含的都是字符串,所以字符串43在使用中与字符串fud是一样合法的。

5 while语句
语法:
     
  1. while conditon do
  2.    statement
  3. done

一个非常简单的密码检查程序
  1. #!/bin/sh
  2. echo "enter password"
  3. read trythis

  4. while [ "$trythis" != "secret" ]  注意:这里do如果加载while后面,要加一个 ;
  5. do                                如:while [ ];do
  6.     echo "tryagain"
  7.     read trythis
  8. done
  9. exit 0




6 until 语句
语法:
       
  1. until conditon           #条件为真,不执行
  2. do
  3. statement
  4. done

7 case语句

  1. case variable in
  2. pattern [ |pattern] ...) statements;;  #注意每个模式 都是以 ;; 结束的
  3. pattern [ |pattern] ...) statements;;
  4. ...
  5. esac

举例一:
 
  1. #!/bin/sh

  2. echo "is it morning ? please answer yes or no"
  3. read timeofday

  4. case "$timeofday" in
  5. yes) echo "good morning";;
  6. no ) echo "good afternoon";;
  7. y ) echo "good morning";;
  8. n ) echo "good afternoon";;
  9. esac

  10. exit 0




改进一:合并匹配模式
只使用一个单独的 * 表示任何匹配的字符串
  1. #!/bin/sh

  2. echo "is it morning ? please answer yes or no"
  3. read timeofday

  4. case "$timeofday" in
  5.     yes|YES|Y|y) echo "good morning";;
  6.     n*|N* ) echo "good afternoon";;
  7.     *) echo "sorry,answer not recognized"
  8. esac

  9. exit 0



改进二
  1. #!/bin/sh

  2. echo "is it morning ? please answer yes or no"
  3. read timeofday

  4. case "$timeofday" in
  5.     yes|YES|Y|y)
  6.         echo "good morning"
  7.         echo "up bright and ealy this morning"
  8.         ;;
  9.     [nN]*)              [nN]表示选择其中一个的意思
  10.         echo "good afternoon"
  11.         ;;
  12.     *)
  13.         echo "sorry,answer not recognized"
  14.         echo "please answer yes or no"
  15.         exit 1
  16.         ;;
  17. esac

  18. exit 0


8 命令列表

AND列表:只有在前面所有的命令执行成功的情况下才执行后面的一条命令

  1. statement1&&statement2&&statement3&&.........    &&的作用是:检查前一条命令的返回值
  2.                                                  如果为真,向右执行,否则返回false

执行 touch file_one命令(检查文件是否存在,如果不存在,则创建它)
删除file_two文件,然后用AND列表检查每个文件是否存在

  1. #!/bin/sh

  2. touch file_one
  3. rm -f file_two

  4. if [ -f file_one ] && echo "hello" &&[ -f file_two ] && echo "there"
  5. then
  6.     echo "in if"
  7. else
  8.     echo "in else"
  9. fi

  10. exit 0



我们可以看到,当检查 -f file_two时,因为file_two删除了,所以这里返回false了,没有继续向下执行


OR列表

结构允许我们持续执行一系列命令直到一条命令成功为止,其后的命令将不再被执行

  1. statement1||statement2||statement3||.........


  1. #!/bin/sh

  2. rm -f file_one

  3. if [ -f file_one ]|| echo "hello"||echo"there"
  4. then
  5.     echo "in if"
  6. else
  7.    echo "in else"

  8. fi

  9. exit 0



9语句块


如果你想使用某些只允许单个语句的地方(比如在AND或OR)使用多条语句,你可以把它们扩在话括号中{ }
中构造一个语句块

  1. get_confirm && {
  2.     grep -v "$cdcatnum" $tracks_file > $temp_file
  3.     cat $temp_file > $strace_file
  4.     echo
  5.     add_record_tracks
  6. }




阅读(1136) | 评论(0) | 转发(0) |
0

上一篇:secrueCRT高级应用

下一篇:linux 连接无线网

给主人留下些什么吧!~~