bash脚本编程:之case语句
 
条件测试:
0: 成功
1-255: 失败
 
命令:
[ expression ]
[[ expression ]]
test expression
 
exPression:
整数测试:
-gt, -ge, -lt, -le, -eq, -ne
字符串:
>, < , >=, <=, ==, !=, =~, -z, -n
文件:
-e, -f, -d, -b, -c, -h, -S, -s, -a, -p, -r, -w, -x
 
多分支的if语句:
if boolean_expression1; then
suite1
elif boolean_expression2; then
suite2
...
elif boolean_expressionn; then
suiten
else
else_suite
fi
 
练习:写一个脚本,接受如此格式
script.sh {start|stop|restart|status}
1、如是start,那么创建/var/lock/subsys/script.sh,显示启动成功;
2、如果参数是stop,则删除/var/lock/subsys/script.sh,显示停止成功
3、如果restart,则删除,再创建,显示成功;
4、如果status, 如果文件存在,则显示running,否则,显示stopped
 
#!/bin/bash
#
myService=`basename $0`
lockFile="/var/lock/subsys/$myService"
 
[ $# -lt 1 ] && echo "Usage: $myService {start|stop|restart|status}" && exit 4
 
if [ "$1" == 'start' ]; then
        touch $lockFile
        echo "Starting $myService OK"
elif [ "$1" == 'stop' ]; then
        rm -f $lockFile
        echo "Stopping $myService OK"
elif [ "$1" == 'restart' ]; then
        rm -f $lockFile
        touch $lockFile
        echo "Restarting $myService OK"
elif [ "$1" == 'status' ]; then
        if [ -f $lockFile ]; then
                echo "$myService is running"
        else
                echo "$myService is stopped"
        fi
else
        echo "Usage: $myService {start|stop|restart|status}"
        exit 3
fi
 
 
case语句的语法格式:
case expression in
pattern1)
suite1 
;;
pattern2)
suite2
;;
...
patternn)
suiten
;;
*)
other_suite
;;
esac
 
上述脚本的case实现:
 
#!/bin/bash
#
myService=`basename $0`
lockFile="/var/lock/subsys/$myService"
 
[ $# -lt 1 ] && echo "Usage: $myService {start|stop|restart|status}" && exit 4
 
case $1 in
'start')
        touch $lockFile
        echo "Starting $myService OK"
        ;;
'stop')
        rm -f $lockFile
        echo "Stopping $myService OK"
        ;;
'restart')
        rm -f $lockFile
        touch $lockFile
        echo "Restarting $myService OK"
        ;;
'status')
        if [ -f $lockFile ]; then
                echo "$myService is running"
        else
                echo "$myService is stopped"
        fi
        ;;
*)
        echo "Usage: $myService {start|stop|restart|status}"
        exit 3
        ;;
esac
 
 
case中各pattern可以使用模式:
a|b: a或者b
*:匹配任意长度的任意字符;
?:匹配任意单个字符;
[-]:范围匹配
 
[a-z])
[0-9])
 
练习:写一个简单脚本
1、提示用户输入一个任意字符;
2、能判断此字符是数字、字母或特殊字符;
 
#!/bin/bash
#
while true; do
read -p "Enter a char: " char
 
[[ "$char" == 'quit' ]] && break
 
case $char in
[a-z])
        echo "letter"
        ;;
[0-9])
        echo "digit"
        ;;
*)
        echo "special"
        ;;
esac
done
 
 
练习:写一个脚本,能对/etc/目录进行打包备份,备份位置为/backup/etc-日期.后缀
1、显示如下菜单给用户:
xz) xz compress
gzip) gzip compress
bip2) bzip2 compress
2、根据用户指定的压缩工具使用tar打包压缩;
3、默认为xz;输入错误则需要用户重新输入;
 
#!/bin/bash
#
[ -d /backup ] || mkdir /backup
 
cat << EOF
Plz choose a compress tool:
 
xz) xz compress
gzip) gzip compress
bip2) bzip2 compress
EOF
 
while true; do
  read -p "Your option: " option
  option=${option:-xz}
 
  case $option in
  xz)
    compressTool='J'
    suffix='xz'
    break ;;
  gzip)
    compressTool='z'
    suffix='gz'
    break ;;
  bzip2)
    compressTool='j'
    suffix='bz2'
    break ;;
  *)
    echo "wrong option." ;;
  esac
done
 
tar ${compressTool}cf /backup/etc-`date +%F-%H-%M-%S`.tar.$suffix /etc/*
 
练习:写一个脚本,完成如下功能
说明:此脚本能够为指定网卡创建别名,指定地址;使用格式:mkethalias.sh -v|--verbose -i|--interface ethX
1|-i选项用于指定网卡;
2、如果网卡存在:在命令行,请用户指定一个别名;
3、让用户指定IP和掩码;
4、用户可以同时使用-v或--verbose选项:如果使用了,则在配置完成后,显示配置结果;否则,则不予显示;
 
#!/bin/bash
#
debug=0
 
while [ $# -ge 1 ]; do
  case $1 in
  -i|--interface)
    ethcard="$2"
    shift 2 ;;
  -v|--verbose)
    debug=1
    shift
    ;;
  *)
    echo "Wrong options or arguments."
    echo "Usage: `basename $0` [-v|--verbose] -i|--interface Interface"
    shift $#
    ;;
  esac
done
 
# echo "Interface: $ethcard , Verbose Flag: $debug "
 
! ifconfig $ethcard &> /dev/null && echo "No this interface..." && exit 3
 
read -p "Enter an alias: " ethAlias
 
read -p "Enter IP: " ipAddr
 
read -p "Mask: " netMask
 
ifconfig $ethAlias $ipAddr netmask $netMask
 
[ $debug -eq 1 ] && ifconfig $ethAlias
 
 
bash脚本编程之函数
模块化编程的工具
 
函数:function,功能组件
 
可被调用:函数有函数名
函数出现的地方,而自动被替换成函数定义的代码
 
函数定义
 
 
语法:
FuncName() {
函数体
}
 
function FuncName {
函数体
}
 
 
函数有两种返回值:
正常返回的数据:
函数中的打印语句,如echo或print
函数中命令的执行结果
执行状态返回值:
取决于函数中执行的最后一条语句
自定义:return N
 
函数可以接受参数:
在函数体可以使用类似脚本调用位置参数一样的参数
$1, $2, ...
$#
$*, $@
 
 
#!/bin/bash
#
function ShowUserInfo {
  [ $# -lt 1 ] && return 6
  grep "^$1\>" /etc/passwd | cut -d: -f3,7
}
 
function main {
while true; do
  read -p "Plz enter a user name: " userName
 
  if [ "$userName" == 'quit' ]; then
        echo "Quit"
        exit 0
  fi
 
  if ! id $userName &> /dev/null; then
    echo "No such user, please again."
    continue
  fi
  ShowUserInfo $userName
done
}
 
main
 
 
练习:写一个脚本,完成如下功能
1、显示如下菜单
disk) show disk info
mem) show memory info
cpu) show cpuinfo
2、显示用户选定的内容;
 
#!/bin/bash
#
ShowMenu() {
cat << EOF
disk) show disk info
mem) show memory info
cpu) show cpuinfo
EOF
}
 
main() {
ShowMenu
read -p "Plz choose an option: " option
case $option in
disk)
   df -h
   ;;
mem)
   free -m
   ;;
cpu)
  cat /proc/cpuinfo
  ;;
*)
  echo "Wrong option"
esac
}
 
main
 
如果在函数中使用变量:变量作用域
在函数中使用了在主程序中声明的变量,重新赋值会直接修改主程序中的变量;
如果不期望函数与主程序中的变量冲突,函数中使用变量都用local修饰;即使用局部变量;
在函数中使用了在主程序中没有声明的变量,在函数执行结束后即被撤消,无论是否使用local修饰符;
 
 
如果想把脚本的全部位置参数,统统传递给脚本中某函数使用,怎么办?
使用$*传递
 
 
 
 
 
练习:写一个脚本,判定172.16.0.0网络内有哪些主机在线,在线的用绿色显示,不在线的用红色显示;要求,编程中使用函数;
 
C类网:ping NetAdd.HostAdd
B类网:ping NetAadd.NetAadd.HostAdd.HostAdd
 
CnetPing() {
for i in {1..254}; do
ping -c 1 -w 1 $1.$i
}
 
# CnetPing 192.168.10
 
BnetPing() {
for j in {0.255}; do
CnetPing $1.$j
done
}
 
AnetPing() {
for m in {0..255}; do
BnetPing $1.$m
done
}
 
netType=`echo $1 | cut -d'.' -f1`
 
if [ $netType -gt 0 -a $netType -le 126 ]; then
AnetPing $1
elif [ $netType -ge 128 -a $netType -le 191 ]; then
  BnetPing $1
elif [ $netType -ge 192 -a $netType -le 223 ]; then
CnetPing $1
else
echo "Wrong"
exit 3
fi
 
 
 
练习:写一个脚本,完成如下功能(使用函数):
1、提示用户输入一个可执行命令;
2、获取这个命令所依赖的所有库文件(使用ldd命令);
3、复制命令至/mnt/sysroot/对应的目录中
解释:假设,如果复制的是cat命令,其可执行程序的路径是/bin/cat,那么就要将/bin/cat复制到/mnt/sysroot/bin/目录中,如果复制的是useradd命令,而useradd的可执行文件路径为/usr/sbin/useradd,那么就要将其复制到/mnt/sysroot/usr/sbin/目录中;
4、复制各库文件至/mnt/sysroot/对应的目录中,其要求命令;
 
#!/bin/bash
#
target=/mnt/sysroot
 
clearCmd() {
  if which $cmd &> /dev/null; then
        cmdPath=`which --skip-alias $cmd`
  else
        echo "No such command"
        return 5
  fi
}
 
cmdCopy() {
        cmdDir=`dirname $1`
        [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}
 
libCopy() {
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
        done
}
 
while true; do
  read -p "Enter a command: " cmd
  if [ "$cmd" == 'quit' ] ;then
        echo "quit"
        exit 0
  fi
  clearCmd $cmd
  [ $? -eq 5 ] && continue
 
  cmdCopy $cmdPath
  libCopy $cmdPath
done
 
 
 
 
练习:写一个脚本,完成如下功能(使用函数):
1、脚本使用格式:
mkscript.sh [-D|--description "script description"] [-A|--author "script author"] /path/to/somefile
2、如果文件事先不存在,则创建;且前几行内容如下所示:
#!/bin/bash
# Description: script description
# Author: script author
#
3、如果事先存在,但不空,且第一行不是“#!/bin/bash”,则提示错误并退出;如果第一行是“#!/bin/bash”,则使用vim打开脚本;把光标直接定位至最后一行
4、打开脚本后关闭时判断脚本是否有语法错误
如果有,提示输入y继续编辑,输入n放弃并退出;
如果没有,则给此文件以执行权限;
 
arguParse() {
 
}
 
 
 
 
 
 
 

bash编程之case语句,函数的更多相关文章

  1. 03 shell编程之case语句与函数

    本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...

  2. SHELL编程之case与函数

    一.case语句概述 使用case语句改写if多分支可以使脚本结构更加清晰.层次分明 针对变量不同取值,执行不同的命令序列 case语句结构如下: case 变量值  in 模式1) 命令序列1 ;; ...

  3. shell编程之case分支语句

    shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...

  4. shell脚本编程之for语句、if语句使用介绍

    介绍了shell脚本编程之for语句.if语句的使用方法. 上部: 面向过程: 顺序执行 选择执行: if, case 循环执行: for, while, until 一.for语句 格式:      ...

  5. Linux/Unix C编程之的perror函数,strerror函数,errno

    #include <stdio.h> // void perror(const char *msg); #include <string.h> // char *strerro ...

  6. linux bash shell中case语句的实例

    本文介绍下,在bash shell编程中,有关case语句的一个例子,学习下case语句的用法,有需要的朋友参考下. 本文转自:http://www.jbxue.com/article/13377.h ...

  7. Shell编程之case条件

    一.case条件语句 1.语法 case "变量" in 值 1) 指令 1... ;; 值 2) 指令 2... ;; *) 指令 3... esac case条件语句的执行流程 ...

  8. shell编程之if语句

    shell编程之if判断 目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other 1.整数比较 -eq 等于,如:if [ "$ ...

  9. 深入理解java:4.3.1. 框架编程之MyBatis---SQL语句执行的完整流程

    Mybatis的整个的执行流程.如下图所示: 原理详解: MyBatis应用程序根据XML配置文件创建SqlSessionFactory, SqlSessionFactory在根据配置,配置来源于两个 ...

随机推荐

  1. Ubuntu设置打不开排错

    记录一次系统设置打不开排错过程 系统信息: ××××××:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu ...

  2. 随机算法瞎练BZOJ3237&3563&3569三倍经验题

    随机方法真的好骚啊O(∩_∩)O~ 最早的时候miaom提出一个奇怪的东西: 判断一个数列中是否有0/1/2个数出现奇数次 对每个数赋一个随机权值,异或乱搞,对于判2的情况用一个(可能类似线性基的)方 ...

  3. 2017百度之星程序设计大赛 - 复赛 Arithmetic of Bomb

    http://acm.hdu.edu.cn/showproblem.php?pid=6144 解法:一个简单的模拟 #include <bits/stdc++.h> using names ...

  4. (转)Linxu磁盘体系知识介绍及磁盘介绍

    Linxu磁盘体系知识介绍及磁盘介绍 系统管理 / 2017-01-14 / 0 条评论 / 浴春风 Linu磁盘设备基础知识指南磁盘速度快具备的条件: 1)主轴的转速5400/7200/10000/ ...

  5. Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)

    不多说,直接上干货! Distributed  matrix : 分布式矩阵 一般能采用分布式矩阵,说明这数据存储下来,量还是有一定的.在Spark Mllib里,提供了四种分布式矩阵存储形式,均由支 ...

  6. css继承性

    不可继承的:display.margin.border.padding.background.height.min-height.max- height.width.min-width.max-wid ...

  7. android studio项目提交Git@OSC

    转载地址:http://www.bubuko.com/infodetail-977061.html 先到git.oscchina.net网站上申请个账号,然后创建一个项目.过程不再说了. 新建工程后, ...

  8. cocos的Director、Scence、Layer(一)---摘自于官方文档

    基本结构图(重要) Director: 有那些作用? OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点(游戏元素)的控制,游戏数据的保存调用,屏幕尺寸的 ...

  9. 初识AutoCompleteTextView

    AutoCompleteTextView自动补全框继承自TextView和EditView,通过一个下拉框的形式可以补全信息. 可以通过setThreshold()方法指定用户输入多少个字符后开始显示 ...

  10. python os,sys模块的使用

    首先,os模块是用来与操作系统进行交互的模块,可以对操作系统上的一些东西进行操作 而sys是用来对解释器进行一些操作的 一.os os.getcwd() 获取当前工作目录,即当前python脚本工作的 ...