条件判断式

利用 if .... then

  • 单层、简单条件判断式

    if [ 条件判断式 ]; then
      当条件判断式成立时,可以进行的命令工作内容;
    fi   <==将 if 反过来写,就成为 fi 啦!结束 if 之意!
    
      [root@www scripts]# cp sh06.sh sh06-2.sh  <==用改的比较快!
      [root@www scripts]# vi sh06-2.sh
      #!/bin/bash
      # Program:
      #       This program shows the user's choice
      # History:
      # 2005/08/25    VBird   First release
      PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
      export PATH
    
      read -p "Please input (Y/N): " yn
    
      if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
          echo "OK, continue"
          exit 0
      fi
      if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
          echo "Oh, interrupt!"
          exit 0
      fi
      echo "I don't know what your choice is" && exit 0
    
  • 多重、复杂条件判断式

    # 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况运行
    if [ 条件判断式一 ]; then
      当条件判断式一成立时,可以进行的命令工作内容;
    elif [ 条件判断式二 ]; then
      当条件判断式二成立时,可以进行的命令工作内容;
    else
      当条件判断式一与二均不成立时,可以进行的命令工作内容;
    fi
    
      [root@www scripts]# vi sh09.sh
      #!/bin/bash
      # Program:
      #    Check $1 is equal to "hello"
      # History:
      # 2005/08/28    VBird    First release
      PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
      export PATH
    
      if [ "$1" == "hello" ]; then
          echo "Hello, how are you ?"
      elif [ "$1" == "" ]; then
          echo "You MUST input parameters, ex> {$0 someword}"
      else
          echo "The only parameter is 'hello', ex> {$0 hello}"
      fi
    

利用『 netstat -tuln 』来取得目前主机有启动的服务, 而且取得的资讯有点像这样:

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

每个端口 (port) 都有其特定的网络服务,几个常见的 port 与相关网络服务的关系是:

80: WWW
22: ssh
21: ftp
25: mail
111: RPC(远程程序呼叫)
631: CUPS(列印服务功能)
testing=$(netstat -tuln | grep ":80 ")   # 侦测看 port 80 在否?
if [ "$testing" != "" ]; then
    echo "WWW is running in your system."
fi
testing=$(netstat -tuln | grep ":22 ")   # 侦测看 port 22 在否?
if [ "$testing" != "" ]; then
    echo "SSH is running in your system."
fi
testing=$(netstat -tuln | grep ":21 ")   # 侦测看 port 21 在否?
if [ "$testing" != "" ]; then
    echo "FTP is running in your system."
fi
testing=$(netstat -tuln | grep ":25 ")   # 侦测看 port 25 在否?
if [ "$testing" != "" ]; then
    echo "Mail is running in your system."
fi

利用 case ..... esac 判断

case  $变量名称 in   <==关键字为 case ,还有变量前有钱字号 
  "第一个变量内容")   <==每个变量内容建议用双引号括起来,关键字则为小括号 )
    程序段
    ;;            <==每个类别结尾使用两个连续的分号来处理!
  "第二个变量内容")
    程序段
    ;;
  *)                  <==最后一个变量内容都会用 * 来代表所有其他值
    不包含第一个变量内容与第二个变量内容的其他程序运行段
    exit 1
    ;;
esac
case $1 in
  "hello")
    echo "Hello, how are you ?"
    ;;
  "")
    echo "You MUST input parameters, ex> {$0 someword}"
    ;;
  *)   # 其实就相当於万用字节,0~无穷多个任意字节之意!
    echo "Usage $0 {hello}"
    ;;
esac

利用 function 功能

function fname() {
    程序段
}

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

[root@www scripts]# vi sh12-2.sh 
#!/bin/bash
# Program:
#    Use function to repeat information.
# History:
# 2005/08/29    VBird    First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

function printit(){
    echo -n "Your choice is "     # 加上 -n 可以不断行继续在同一行显示
}

echo "This program will print your selection !"
case $1 in
  "one")
    printit; echo $1 | tr 'a-z' 'A-Z'  # 将参数做大小写转换!
    ;;
  "two")
    printit; echo $1 | tr 'a-z' 'A-Z'
    ;;
  "three")
    printit; echo $1 | tr 'a-z' 'A-Z'
    ;;
  *)
    echo "Usage $0 {one|two|three}"
    ;;
esac