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

相关推荐

  • 马哥教育网络19期+第五周练习博客

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;   grep "^[[:space:]]\+.*" /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; &n…

    Linux干货 2016-06-19
  • linux bash环境变量简单总结

    一.环境变量简介Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都 是相同的,这个默认环境实际上就是一组环境变量的定义。 环境变量是全局的,设置好的环境变量可以被所有当前用户所运行的程序所使用。 用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。 …

    Linux干货 2015-09-14
  • linux启动流程+任务计划

    20160907 一、作业 1、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd” 2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中 二、博客 1、centos5,6启动流程 开机——POST…

    Linux干货 2016-09-08
  • 数据库基础

    数据库基础 一、数据模型 数据库模型图 1、层次模型、2、网状模型、 3、关系模型二维关系: 表:就是一个关系及属性的描述,如:学生(学好,姓名,性别,班级)       行:row, entity       列:colume,…

    Linux干货 2016-10-19
  • 第六周作业 bash编程学得好痛苦啊,啊啊啊~~需要挺住!

    请详细总结vim编辑器的使用并完成以下练习题 VIM很强大,但是万变不离其宗,最核心的三模式以下图表示: 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; :%s/^[[:blank:]]\+.*/\0#/g 2、复制/boot/grub/grub.conf至/…

    Linux干货 2016-12-19
  • history          每打开一个终端都会从文件(.bash_history)中加载历史记录           不同终端历史记录不同彼此终端不共享 …

    2017-07-15

评论列表(1条)

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

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