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: 指定结束定界符

使用示例

[[email protected] ~#]read -p "please input a word:" Key

[[email protected] ~#]read -t 3 Key

[[email protected] ~#]read -r KeyI love you \

[[email protected] ~#]read -n 5 K

[[email protected] ~#]read -d":" Key


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号等信息。

[[email protected] ~/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   # 程序结束

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

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
~

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

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

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

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

if语句暂且告一段落!

止战

2016.8.18

时间: 2024-12-24 20:15:30

bash编程初体验(二)的相关文章

bash编程初体验之for

bash编程初体验之for for while until 概述 本文将介绍以for为代表的循环语句在shell 脚本中的应用,常见的循环语句有for, while, until,作为循环语句,顾名思义,它就是重复地做一件事,直到满足某一条件而退出:另外,还有两个循环控制语句continue与break来配合循环语句,以实现临时中断或跳出循环的功能:以下为for, while, until的知识点提炼: for, while, until 进入条件          for: 列表元素非空   

Shell脚本编程初体验

Shell脚本编程初体验 分类 编程技术 通 常,当人们提到"shell脚本语言"时,浮现在他们脑海中是bash,ksh,sh或者其它相类似的linux/unix脚本语言.脚本语言是与计算机 交流的另外一种途径.使用图形化窗口界面(不管是windows还是linux都无所谓)用户可以移动鼠标并点击各种对象,比如按钮.列表.选框等等.但 这种方式在每次用户想要计算机/服务器完成相同任务时(比如说批量转换照片,或者下载新的电影.mp3等)却是十分不方便.要想让所有这些事情变得简单并 且自动

Swift初体验(二)

// 函数写法初体验 func getMyName(firstName first:String, lastName last:String) -> String{ //return first + "-" + last return first + last } var myName = getMyName(firstName: "hu", lastName: "mingtao") println("myName = \(myN

WMI脚本编程初体验

1.简介 WMI是Windows 的管理支持技术,WMI最初于 1998 年作为一个附加组件与 Windows NT 4.0 Service Pack 4 一起发行,是内置在 Windows 2000.Windows XP 和 Windows Server 2003 系列操作系统中核心的管理支持技术. WMI 是一种规范和基础结构,通过它可以访问.配置.管理和监视所有的 — 几乎所有的 Windows 资源. 2.WMI脚本编程初体验 先看一个例子:使用 WMI 和 VBScript 检索总物理

结对编程初体验——代码复审

这一次和室友结对编程,第一项任务就是互看代码.想到上一次这样认真看她的C++代码,是一年前学程序设计这门课时,帮她人工debug.虽然都是从头到尾认真读代码.通逻辑,感觉却是不同的,之前的关注点是bug在哪,而现在却是带着任务的,要关注代码核查表中的项目.结果看着看着,总感觉自己在找茬dbq 回归正题↓ 编译环境:Dev-C++ 5.9.2 程序语言:C++ (一)优点: 能发现的优点,大多都是自己的缺点 1.代码可读性强. 通过详细的注释,即便是我们两个的个人项目使用的不是同一种语言,我看懂她

Linux下使用gcc编程初体验,实现日历程序

近期刚刚放弃了Windows,投入了Ubuntu 的怀抱.今天就拿一个小小的案例来做一下C语言的编译和运行流程.额,顺便说一句.本文适合那些Linux新手,不适合老鸟哈. 看完本文可以学到什么? 程序员编码神器Vim的简单使用 自带编译器gcc的使用 执行编译完成的程序 vim的简单使用 关于vim的使用,这里面的学问可谓是太深了,所以我就简单的写一些在这里用到的一些命令了. 首先:打开终端terminal.使用cd命令定位到我们将要操作的一个文件夹,我本人的是/home/mark/code/c

Jquery初体验二

一.传统方式生成Table var peopleArr = [ { "name": "刘欢", "age": 50, "skill": "从头再来" }, { "name": "杨坤", "age": 35, "skill": "32唱演唱会" }, { "name": "那英&

Erlang OTP编程初体验——gen_server和行为模式

http://blog.sina.com.cn/s/blog_3fe961ae0101k4p6.html 行为模式其实非常类似于面向对象语言中的接口,至少笔者是这么理解的.OTP行为模式将一些反复出现的模式分成了两个部分,通用部分和具体应用相关的实现部分,这一过程其实就类似于面向对象编程中的抽象出接口的过程.本文给出一个OTP中最常见的行为模式的示例:通用服务器,即gen_server. 编写gen_server回调模块大致包括3相步骤: (1) 确定回调模块的名称: (2) 写接口函数(由客户

GUI应用编程初体验

不同平台的GUI实现原理是一样的. 本实验基于 windos平台. 先捋一捋概念 什么是消息队列(Message Queue) 假 设一个场景:系统正在处理WM_PAINT消息,就在这时用户在键盘上敲击了一些按键,这时会发生什么呢?系统应该中断绘图操作然后处理按键消息还是应该 丢弃按键的消息?很明显这些都是不合理的,因此我们引入了消息队列,当消息发送过来,将消息加入消息队列,当一个消息被处理时,将其从消息队列移除.这样 确保消息不会丢失,当你正在处理一个消息时,其它到来的消息可以加入到消息队列直