利用 if .... then


  • 单层、简单条件判断式
  1. if [ 条件判断式 ]; then
  2. 当条件判断式成立时,可以进行的命令工作内容;
  3. fi <==将 if 反过来写,就成为 fi !结束 if 之意!
  • && 代表 AND ;
  • || 代表 or ;

[ "$yn" == "Y" -o "$yn" == "y" ]
上式可替换为
[ "$yn" == "Y" ] || [ "$yn" == "y" ]

  1. [root@www scripts]# cp sh06.sh sh06-2.sh <==用改的比较快!
  2. [root@www scripts]# vi sh06-2.sh
  3. #!/bin/bash
  4. # Program:
  5. # This program shows the user's choice
  6. # History:
  7. # 2005/08/25 VBird First release
  8. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  9. export PATH
  10.  
  11. read -p "Please input (Y/N): " yn
  12.  
  13. if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
  14. echo "OK, continue"
  15. exit 0
  16. fi
  17. if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
  18. echo "Oh, interrupt!"
  19. exit 0
  20. fi
  21. echo "I don't know what your choice is" && exit 0

  • 多重、复杂条件判断式
  1. # 一个条件判断,分成功进行与失败进行 (else)
  2. if [ 条件判断式 ]; then
  3. 当条件判断式成立时,可以进行的命令工作内容;
  4. else
  5. 当条件判断式不成立时,可以进行的命令工作内容;
  6. fi
  1. # 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况运行
  2. if [ 条件判断式一 ]; then
  3. 当条件判断式一成立时,可以进行的命令工作内容;
  4. elif [ 条件判断式二 ]; then
  5. 当条件判断式二成立时,可以进行的命令工作内容;
  6. else
  7. 当条件判断式一与二均不成立时,可以进行的命令工作内容;
  8. fi
  1. [root@www scripts]# cp sh06-2.sh sh06-3.sh
  2. [root@www scripts]# vi sh06-3.sh
  3. #!/bin/bash
  4. # Program:
  5. # This program shows the user's choice
  6. # History:
  7. # 2005/08/25 VBird First release
  8. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  9. export PATH
  10.  
  11. read -p "Please input (Y/N): " yn
  12.  
  13. if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
  14. echo "OK, continue"
  15. elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
  16. echo "Oh, interrupt!"
  17. else
  18. echo "I don't know what your choice is"
  19. fi

一般来说,如果你不希望使用者由键盘输入额外的数据时, 让使用者在下达命令时就将参数带进去! 现在我们想让使用者输入『 hello 』这个关键字时,利用参数的方法可以这样依序设计:

  1. 判断 $1 是否为 hello,如果是的话,就显示 "Hello, how are you ?";
  2. 如果没有加任何参数,就提示使用者必须要使用的参数下达法;
  3. 而如果加入的参数不是 hello ,就提醒使用者仅能使用 hello 为参数。

整个程序的撰写可以是这样的:

  1. [root@www scripts]# vi sh09.sh
  2. #!/bin/bash
  3. # Program:
  4. # Check $1 is equal to "hello"
  5. # History:
  6. # 2005/08/28 VBird First release
  7. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  8. export PATH
  9.  
  10. if [ "$1" == "hello" ]; then
  11. echo "Hello, how are you ?"
  12. elif [ "$1" == "" ]; then
  13. echo "You MUST input parameters, ex> {$0 someword}"
  14. else
  15. echo "The only parameter is 'hello', ex> {$0 hello}"
  16. fi

netstat命令可以查询到目前主机有开启的网络服务端口 (service ports)

  1. [root@www ~]# netstat -tuln
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State
  4. tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
  5. tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
  6. tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
  7. tcp 0 0 :::22 :::* LISTEN
  8. udp 0 0 0.0.0.0:111 0.0.0.0:*
  9. udp 0 0 0.0.0.0:631 0.0.0.0:*
  10. #封包格式 本地IP:端口 远程IP:端口 是否监听

上面的重点是『Local Address (本地主机的IP与端口对应)』那个栏位,他代表的是本机所启动的网络服务!若为 127.0.0.1 则是仅针对本机开放,若是 0.0.0.0 或 ::: 则代表对整个 Internet 开放。 每个端口 (port) 都有其特定的网络服务,几个常见的 port 与相关网络服务的关系是:

  • 80: WWW
  • 22: ssh
  • 21: ftp
  • 25: mail
  • 111: RPC(远程程序呼叫)
  • 631: CUPS(列印服务功能)

假设我的主机有兴趣要侦测的是比较常见的 port 21, 22, 25及 80 时,那我如何透过 netstat 去侦测我的主机是否有开启这四个主要的网络服务端口呢?由於每个服务的关键字都是接在冒号『 : 』后面, 所以可以藉由撷取类似『 :80 』来侦测的!那我就可以简单的这样去写这个程序喔:

  1. [root@www scripts]# vi sh10.sh
  2. #!/bin/bash
  3. # Program:
  4. # Using netstat and grep to detect WWW,SSH,FTP and Mail services.
  5. # History:
  6. # 2005/08/28 VBird First release
  7. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  8. export PATH
  9.  
  10. # 1. 先作一些告知的动作而已~
  11. echo "Now, I will detect your Linux server's services!"
  12. echo -e "The www, ftp, ssh, and mail will be detect! \n"
  13.  
  14. # 2. 开始进行一些测试的工作,并且也输出一些资讯罗!
  15. testing=$(netstat -tuln | grep ":80 ") # 侦测看 port 80 在否?
  16. if [ "$testing" != "" ]; then
  17. echo "WWW is running in your system."
  18. fi
  19. testing=$(netstat -tuln | grep ":22 ") # 侦测看 port 22 在否?
  20. if [ "$testing" != "" ]; then
  21. echo "SSH is running in your system."
  22. fi
  23. testing=$(netstat -tuln | grep ":21 ") # 侦测看 port 21 在否?
  24. if [ "$testing" != "" ]; then
  25. echo "FTP is running in your system."
  26. fi
  27. testing=$(netstat -tuln | grep ":25 ") # 侦测看 port 25 在否?
  28. if [ "$testing" != "" ]; then
  29. echo "Mail is running in your system."
  30. fi

由於日期是要用相减的方式来处置,所以我们可以透过使用 date 显示日期与时间,将他转为由 1970-01-01 累积而来的秒数, 透过秒数相减来取得剩余的秒数后,再换算为日数即可。整个脚本的制作流程有点像这样:

  1. 先让使用者输入他们的退伍日期;
  2. 再由现在日期比对退伍日期;
  3. 由两个日期的比较来显示『还需要几天』才能够退伍的字样。

利用『 date --date="YYYYMMDD" +%s 』转成秒数后,接下来的动作就容易的多了!如果你已经写完了程序,对照底下的写法试看看:

  1. [root@www scripts]# vi sh11.sh
  2. #!/bin/bash
  3. # Program:
  4. # You input your demobilization date, I calculate how many days
  5. # before you demobilize.
  6. # History:
  7. # 2005/08/29 VBird First release
  8. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  9. export PATH
  10.  
  11. # 1. 告知使用者这支程序的用途,并且告知应该如何输入日期格式?
  12. echo "This program will try to calculate :"
  13. echo "How many days before your demobilization date..."
  14. read -p "Please input your demobilization date (YYYYMMDD ex>20090401): " date2
  15.  
  16. # 2. 测试一下,这个输入的内容是否正确?利用正规表示法
  17. date_d=$(echo $date2 |grep '[0-9]\{8\}') # 看看是否有八个数字
  18. if [ "$date_d" == "" ]; then
  19. echo "You input the wrong date format...."
  20. exit 1
  21. fi
  22.  
  23. # 3. 开始计算日期
  24. declare -i date_dem=`date --date="$date2" +%s` # 退伍日期秒数
  25. declare -i date_now=`date +%s` # 现在日期秒数
  26. declare -i date_total_s=$(($date_dem-$date_now)) # 剩余秒数统计
  27. declare -i date_d=$(($date_total_s/60/60/24)) # 转为日数
  28. if [ "$date_total_s" -lt "0" ]; then # 判断是否已退伍
  29. echo "You had been demobilization before: " $((-1*$date_d)) " ago"
  30. else
  31. declare -i date_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))
  32. echo "You will demobilize after $date_d days and $date_h hours."
  33. fi

利用 case ..... esac 判断

  1. case $变量名称 in <==关键字为 case ,还有变量前有钱字号
  2. "第一个变量内容") <==每个变量内容建议用双引号括起来,关键字则为小括号 )
  3. 程序段
  4. ;; <==每个类别结尾使用两个连续的分号来处理!
  5. "第二个变量内容")
  6. 程序段
  7. ;;
  8. *) <==最后一个变量内容都会用 * 来代表所有其他值
  9. 不包含第一个变量内容与第二个变量内容的其他程序运行段
  10. exit 1
  11. ;;
  12. esac <==最终的 case 结尾!『反过来写』!
  1. [root@www scripts]# vi sh09-2.sh
  2. #!/bin/bash
  3. # Program:
  4. # Show "Hello" from $1.... by using case .... esac
  5. # History:
  6. # 2005/08/29 VBird First release
  7. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  8. export PATH
  9.  
  10. case $1 in
  11. "hello")
  12. echo "Hello, how are you ?"
  13. ;;
  14. "")
  15. echo "You MUST input parameters, ex> {$0 someword}"
  16. ;;
  17. *) # 其实就相当於万用字节,0~无穷多个任意字节之意!
  18. echo "Usage $0 {hello}"
  19. ;;
  20. esac

/etc/init.d/syslog restart

一般来说,使用『 case $变量 in 』这个语法中,当中的那个『 $变量 』大致有两种取得的方式:

  • 直接下达式:例如上面提到的,利用『 script.sh variable 』 的方式来直接给予 $1 这个变量的内容,这也是在 /etc/init.d 目录下大多数程序的设计方式。
  • 互动式:透过 read 这个命令来让使用者输入变量的内容。

让使用者能够输入 one, two, three ,
并且将使用者的变量显示到萤幕上,如果不是 one, two, three 时,就告知使用者仅有这三种选择。

  1. [root@www scripts]# vi sh12.sh
  2. #!/bin/bash
  3. # Program:
  4. # This script only accepts the flowing parameter: one, two or three.
  5. # History:
  6. # 2005/08/29 VBird First release
  7. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  8. export PATH
  9.  
  10. echo "This program will print your selection !"
  11. # read -p "Input your choice: " choice # 暂时取消,可以替换!
  12. # case $choice in # 暂时取消,可以替换!
  13. case $1 in # 现在使用,可以用上面两行替换!
  14. "one")
  15. echo "Your choice is ONE"
  16. ;;
  17. "two")
  18. echo "Your choice is TWO"
  19. ;;
  20. "three")
  21. echo "Your choice is THREE"
  22. ;;
  23. *)
  24. echo "Usage $0 {one|two|three}"
  25. ;;
  26. esac

利用 function 功能

  1. function fname() {
  2. 程序段
  3. }

因为 shell script 的运行方式是由上而下,由左而右, 因此在 shell script 当中的 function 的配置一定要在程序的最前面, 这样才能够在运行时被找到!

  1. [root@www scripts]# vi sh12-2.sh
  2. #!/bin/bash
  3. # Program:
  4. # Use function to repeat information.
  5. # History:
  6. # 2005/08/29 VBird First release
  7. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  8. export PATH
  9.  
  10. function printit(){
  11. echo -n "Your choice is " # 加上 -n 可以不断行继续在同一行显示
  12. }
  13.  
  14. echo "This program will print your selection !"
  15. case $1 in
  16. "one")
  17. printit; echo $1 | tr 'a-z' 'A-Z' # 将参数做大小写转换!
  18. ;;
  19. "two")
  20. printit; echo $1 | tr 'a-z' 'A-Z'
  21. ;;
  22. "three")
  23. printit; echo $1 | tr 'a-z' 'A-Z'
  24. ;;
  25. *)
  26. echo "Usage $0 {one|two|three}"
  27. ;;
  28. esac
   

function 也是拥有内建变量的,
函数名称代表示 $0 ,而后续接的变量也是以 $1, $2...

  1. [root@www scripts]# vi sh12-3.sh
  2. #!/bin/bash
  3. # Program:
  4. # Use function to repeat information.
  5. # History:
  6. # 2005/08/29 VBird First release
  7. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  8. export PATH
  9.  
  10. function printit(){
  11. echo "Your choice is $1" # 这个 $1 必须要参考底下命令的下达
  12. }
  13.  
  14. echo "This program will print your selection !"
  15. case $1 in
  16. "one")
  17. printit 1 # 请注意, printit 命令后面还有接参数!
  18. ;;
  19. "two")
  20. printit 2
  21. ;;
  22. "three")
  23. printit 3
  24. ;;
  25. *)
  26. echo "Usage $0 {one|two|three}"
  27. ;;
  28. esac

 

第十三章、学习 Shell Scripts 条件判断式的更多相关文章

  1. 第十三章、学习 Shell Scripts 善用判断式

    善用判断式 利用 test 命令的测试功能 我要检查 /dmtsai 是否存在时,使用: [root@www ~]# test -e /dmtsai [root@www ~]# test -e /dm ...

  2. shell编程 条件判断式----利用 case ..... esac 判断

    条件判断式----利用 case ..... esac 判断 case  $变量名称 in   <==关键词为 case ,还有变量前有钱字号 "第一个变量内容")   &l ...

  3. shell编程 条件判断式----利用 if .... then ----多重

    条件判断式----利用 if .... then ----多重 在同一个数据的判断中,如果该数据需要进行多种不同的判断时,应该怎么作?举例来说,上面的 sh06.sh 脚本中,我们只要进行一次 $yn ...

  4. 【shell】条件判断式

    条件判断式的表示格式: 文件判断式: [root@andon ~]# [ -e /root/1 ] && echo yes || echo no #注意[]里面的空格,第一个命令为真打 ...

  5. Linux学习 -- Shell编程 -- 条件判断

    按照文件类型进行判断 两种格式 test -e /root/install.log [ -e /root/install.log ]   注意空格  适合用于脚本中 echo $?可以看到结果 [ - ...

  6. 第十三章、学习 Shell Scripts

    什么是 Shell scripts shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』 shell script 是利用 shell 的功能所写 ...

  7. 鸟哥的Linux私房菜——第十六章:学习Shell Scripts

    视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script       (shell写的脚本)1.1 干嘛学习 shell s ...

  8. 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)

    第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...

  9. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

随机推荐

  1. linux cd命令不带路径参数

    #切换到当前用户的主目录.若为root用户,则切换到/root,若普通用户,则切换到/home/username $ cd

  2. [itint5]任务调度

    http://www.itint5.com/oj/#10 拓扑排序.首先按照题目给出的数据结构复杂度不会是O(v+e)的,所以先要变换数据结构.二来写的时候用一个stack会更好点.还有就是题目里其实 ...

  3. Java 的 Class Path 和 Package

    前言:   由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所以就直接写了一篇, 还请大家见谅. 正文:一, 类路径 (class path)   当你满怀着希望安装好了 java, ...

  4. POJ1328——Radar Installation

    Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side ...

  5. Android安全问题 抢先接收广播 - 内因篇之广播发送流程

    导读:本文说明系统发送广播的部分流程,如何利用Intent查找到对应接收器.我们依然只关注接收器的排序问题 这篇文章主要是针对我前两篇文章 android安全问题(四) 抢先开机启动 - 结果篇 an ...

  6. web.xml的说明

    <!--DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. Copyright 2000-2007 Sun Microsystems ...

  7. JMS基础(1)

    1.  消息中间件: 将信息以消息的形式,从一个应用程序传送到另一个或多个应用程序. 主要特点: (1) 消息异步接收: 消息发送者不需要等待消息接收者的响应 (2) 消息可靠接收: 确保消息在中间件 ...

  8. Android开发之音乐播放器的实现

    Android音乐播放器 使用到Android的Actiivity和Service组件 播放音频的代码应该运行在服务中,定义一个播放服务MusicService,服务里定义play.stop.paus ...

  9. SQLite支持的SQL数据操作

    事务处理 Posted on 2013 年 1 月 1 日 by 林溪   事务为一组SQL命令的集合,这些SQL命令在执行时不可进行分割,即要么全部执行这些SQL命令,要么一个都不进行执行,事务操作 ...

  10. 谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法

    最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在jav ...