bash编程初体验之if
  • read

  • if

  • case


概述

在本篇文章中,我们将介绍bash编程中有关if语句的简单用法,if语句的基本思路是判断给定的条件是否满足,即结果是真还是假,从而选择执行哪种操作。如此,如果条件为真,if会执行一种指令,如果条件为假,if会选择执行另一种指令,这种执行就是所谓的选择结构,它能够改变命令的基本顺序流结构,以选择流的形式运行。

在有关if语句的论述中,我们还将介绍read命令,因为read命令可以方便地引入一个或多个变量,可以天然地与if语句结合;另外,除了if语句,还有一种常见的选择语句:case语句,其简单易用,高效简洁,是在一组可能的值中评估一个或多个变量时的不二选择。当然,case语句可以与if语句嵌套。

read

主要用途

读取变量

Read a line from the standard input and split it into fields.

read命令可以一次读取一个或多个变量的值,变量和输入的值都需要空格隔开;如果没有指定变量名,读取的变量将被自动赋值给特定的变量REPLY.

常用选项

  1. -p: 指定读取值时的提示符

  2. -t: 指定读取值时等待的时间,以秒为单位

  3. -r: 允许输入包含反斜杠

  4. -n #: 从输入中读取#个字符,不需要按回车读取

  5. -d: 指定结束定界符

使用示例

[root@centos7 ~#]read -p "please input a word:" Key

bash编程初体验之if_read

[root@centos7 ~#]read -t 3 Key

bash编程初体验之if_shell_02

[root@centos7 ~#]read -r KeyI love you \

bash编程初体验之if_if语句_03

[root@centos7 ~#]read -n 5 K

bash编程初体验之if_read_04

[root@centos7 ~#]read -d":" Key

bash编程初体验之if_if语句_05


if

if是一种结构化语句,bash shell中的if语句运行在if行定义的命令,如果命令的退出状态码为0,将执行then后的所有命令,如果命令的退出状态码为其它值,则不会执行then后的语句,而是直接跳到下一条语句。

if语句简介:

单分支#!/bin/bash #if COMMANDthen 
    COMMANDSfi---------------------------------------------------------------------------
双分支#!/bin/bash#if COMMANDthen 
    COMMANDSelse
    COMMANDSfi--------------------------------------------------------------------------

多分支#!/bin/bash#if COMMANDthen 
    COMMANDSelif
    COMMANDSelif 
    COMMANDSelse
    COMMANDSfi

case语句

case语句,适用于某种条件判断,如在一组数据中评估一个或多个变量的值。case支持glog风格的通配符,

*: 任意长度任意字符
?: 任意单个字符
[]: 指定范围内的任意单个字符
a|b: a或b

case语句简介:

case 变量引用 in
PART1)
    分支1
    ;;
PART2)
    分支2
    ;;
PART3)
    分支3
    ;;
...
*)
    默认分支
    ;;
esac

练习

1.写一个脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息。

[root@centos7 ~/bin#]vim createuser.sh 
  1 #!/bin/bash
  2 #
  3 # Add a user:以用户名为参数,存在即显示其存在,不存在则添加,并显示其id等信息
  4 if [ $# -lt 1 ]    # 符合条件则执行then,否则执行else
  5 then  
  6         echo "please input one USERNAME: $0 USERNAME"
  7         exit 1
  8 else     
  9         id $1 &> /dev/null  # 符合条件则进行下一个if判断,此处为if嵌套
 10         if [ $? -eq 0 ]; then 
 11                 echo "The user is exist."
 12         elif [ $? -ne 0 ]; then 
 13                 useradd $1 && echo "add a $1"
 14                 id $1
 15         fi 
 16 fi   # 程序结束

bash编程初体验之if_shell_06

2.写一个脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息。

  1 #!/bin/bash
  2 #
  3 # 输入yes or no 并显示之
  4 read -p "please input a yes or no!" KEY  # 通过read 引入了变量Key
  5 case $KEY in  
  6 [Yy][Ee][Ss]|[Yy])   # 在一组数值中评估Key变量
  7   echo "yes"
  8   ;;  
  9 [Nn][Oo]|[Nn]) 
  10   echo "no"
 11   ;; 
 12 *) 
 13   echo "please again"
 14   ;; 15 esac

bash编程初体验之if_if语句_07

3.写一个脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

  1 #!/bin/bash 
  2 #
  3 #判断文件类型
  4 
  5 if [[ $# -lt 1 ]]
  6 then  
  7         echo "please input a FILENAME: $0 fILENAME"
  8 else
  9         file -b $1
 10 fi
~

bash编程初体验之if_if语句_08

if与case的嵌套:

  1 #!/bin/bash
  2 #
  3 # 判断文件类型
  4 
  5 if [[ $# -lt 1 ]]
  6 then  
  7         echo "please input a FILENAME: $0 FILENAME"
  8 else
  9         Key=`ls -l $1 |cut -c1` 
  10         case $Key in       # 注意要写成$Key 而非Key
 11         l) 
 12                 echo "link file"
 13         ;; 
 14         -) 
 15                 echo "common file"
 16         ;; 
 17         d) 
 18                 echo "directory file"
 19         ;; 
 20         t) 
 21                 echo "sticky directory"
 22         ;; 
 23         *) 
 24                 echo "other file"
 25         ;; 
 26         esac 
 27 fi

bash编程初体验之if_read_09

4.试判断一个整数

#!/bin/bash
#
#判断是否为整数,第4行可简写为 let var=$1,然后第11与12行可移到第二个if嵌套
#该脚本对输入为字母的情况会有错误信息输出,但不影响判断脚本
#要想解决此问题,可试用grep

[[ $# -eq 0 ]] && echo "please input a integer." && exit 1 
(int=$(expr $1 + $1)) &> /dev/null
if [ $? -eq 0 ]; then 
        if [ $1 -gt 0 ]; then
                echo "$1 is a positive integer."
        else  
                echo "$1 is a negative integer."
        fi
elif [ $1 -eq 0 ];then
        echo "$1 is a 0"
else
        echo "$1 is not a integer."
fi

bash编程初体验之if_shell_10

5.写一个脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息.

#!/bin/bash
#
# Add a user:以用户名为参数,存在即显示其存在,不存在则添加,并显示其id等信息

if [ $# -lt 1 ]then 
        echo "please input one USERNAME: $0 USERNAME"
        exit 1
else
        id $1 &> /dev/null        
        if [ $? -eq 0 ]; then 
                echo "The user is exist."
        elif [ $? -ne 0 ]; then 
                useradd $1 && echo "add a $1"
                id $1
        fi
fi

bash编程初体验之if_read_11

6.给出一个系统菜单,打印出硬盘、内存、cpu信息

#!/bin/bash 
#

cat <<EOF
disk) show disk info
mem) show memory info
cpu) show cpu info
*) quit 
EOFread -p "Please input your choice: " choice
if [[ "$choice" == 'disk' ]]
then 
        fdisk -l 
elif [[ "$choice" == 'mem' ]]
then 
        free -m 
elif [[ "$choice" == 'cpu' ]]
then 
        lscpu
else
        echo "Unknow choice"
        exit 3
 fi


7.判断用户类别

#!/bin/bash 
#
[ $# -lt 1 ] && echo "Please input one user: " && exit 1
! id $1 && echo "No such user." && exit 2
id_user=$(id -u $1)
if [ $id_user -eq 0 ]
then 
        echo "root"
elif [ $id_user -ge 1000 ]
then 
        echo "login user"
else 
        echo "system user"
fi

bash编程初体验之if_read_12

if语句暂且告一段落!

止战

2016.8.18