bash编程初体验(二)

bash编程初体验(二)


  • 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

wKiom1e1olLABIsdAABAVrj0Jp8294.png

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

wKioL1e1omex-u1kAAB_UDqrVDk451.png

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

wKioL1e1on6QWhwiAAB6-DUgylk958.png

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

wKiom1e1opngw-WHAADzfyaS2k0074.png

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

wKioL1e1or_zQsYBAABTTpnxRN8026.png


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   # 程序结束

wKioL1e1o6TC5oGrAABkNsjLiD8984.png

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

wKiom1e1o_Gx5frWAAB2A0m4sPM847.png

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
~

wKioL1e1pBWz70AaAADpHuOrErg092.png

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

wKioL1e1pFjBvNvcAABHe_FONu4276.png

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

wKioL1e1pTKyOOYJAADDhqRcptY279.png

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

wKiom1e1pZXg22FmAABqKvA3PGw170.png

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

wKioL1e1pz6yjqYRAACPm2vQxXY726.png

if语句暂且告一段落!

止战

2016.8.18

原创文章,作者:Liansir,如若转载,请注明出处:http://www.178linux.com/37428

(0)
LiansirLiansir
上一篇 2016-08-19
下一篇 2016-08-19

相关推荐

  • tar,cpio,rpm,yum的使用详解(适合初学者)

    基于linux下的tar包管理和yum源配置 友情提示:对于这些实际操作的,还是需要进行手工的尝试,由于这几个对于包管理的是比较常用和实用的, 所以,一定要熟练使用。 1.tar tar是对于系统中文件,目录等进行打包,解包的工具。tar也可以对文件进行打包存放到别的目录下, 所以在很早的时候,一些老的工程师经常使用tar对文件进行备份。很大程度上,所谓的t…

    Linux干货 2016-08-21
  • 马哥教育网络班N22期+第三周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。    who | cut -d " " -f 1 | sort | uniq 2、取出最后登录到当前系统的用户的相关信息。    last | head -n 1  3、取出当前系统上被用户当作其默…

    Linux干货 2016-09-08
  • yum详解

    yum YUM: Yellowdog Update Modifier,rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包,up2date的替代工具 yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下) yum对软件包的管理机制 —–引用了…

    Linux干货 2016-08-25
  • 通用二进制安装MySQL(MariaDB)

    一、前言     MySQL是一个关系型数据库管理系统,是最流行的关系型数据库管理系统,由于其体积小、速度快、总体拥有成本低,并且之前是完全开源,所以大受欢迎。但由于后面MySQL卖给了SUN,随后SUN被Oracle收购,虽然也有开源免费版本,但是很多功能都需要另外购买商业版本,导致现在MySQL使用份额逐渐减少。所…

    Linux干货 2015-10-15
  • session sticky + session cluster 实战

    前言 在做负载均衡集群的时候,如果后端是应用服务器,我们就有一个不得不考虑的一个问题:会话绑定。为了追踪会话,我们常见的有三种方式:(1)session sticky:会话粘性,常见有2种方式: source_ip:采用源地址绑定方式 nginx:ip_hash,ip地址哈希 haproxy:source lvs:sh,源地址哈希 cookie:基于cook…

    Linux干货 2017-02-13
  • find用法及德·摩根定律

    德·摩根定律   奥古斯都·德·摩根首先发现了在逻辑命题中存在着下面这些关系:      非(P且Q)=非P或非Q      非(P或Q)=非P且非Q 上述逻辑命题可以解释为:    not ( P and Q)=not P or not Q    …

    Linux干货 2016-08-18

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 13:54

    文章对if、case语句的语法有了相应的总结和练习,多些,多练,多看优秀代码。才能写出优秀的脚本。