脚本作业–函数练习

1、编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running…”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”

其中:SCRIPT_NAME为当前脚本名

[root@fengl bin]# cat testsrv.sh 
#!/bin/bash

name=`basename $0`
filename=/var/lock/subsys/$name
creatfile ()
{
    if [ -f ${filename} ] ;then
        echo "程序已启动,正在运行...";exit
    else 
        echo "程序正在启动..."
        touch ${filename}
        [ $? -eq 0 ] && echo "启动成功"
    fi
}
delfile ()
{
    if [ -f ${filename} ] ;then
        echo "程序正在停止..."
        rm -f ${filename} && echo "停止成功"
    else 
        echo "程序未运行"
    fi    
}
stat ()
{
    if [ -f ${filename} ];then
        echo "${name} is running ..."
    else
        echo "${name} is stopped ..."
    fi
}
case $1 in
start)
    creatfile
    ;;
stop)
    delfile
    ;;
restart)
    delfile
    creatfile
    ;;
status)
    stat
    ;;
*)
    echo "输入格式错误";exit
    ;;
esac

1GIF.gif

2、编写脚本/root/bin/copycmd.sh
(1) 提示用户输入一个可执行命令名称;
(2) 获取此命令所依赖到的所有库文件列表
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下;
如:/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd==> /mnt/sysroot/usr/bin/passwd
(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:
如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出

[root@fengl bin]# cat copycmd.sh 
#!/bin/bash

copydir="/mnt/sysroot"
[ ! -d ${copydir} ] && mkdir ${copydir}
bincopy () {
    if which $1 &> /dev/null ;then
        local cmd_path=`which --skip-alias $1`
        local bin_dir=`dirname ${cmd_path}`
        [ -d ${copydir}${bin_dir} ] || mkdir -p ${copydir}${bin_dir}
        [ -f ${copydir}${cmd_path} ] || cp ${cmd_path} ${copydir}${bin_dir}
        echo "${cmd_path}---->文件复制完成"
    else
        echo "输入的命令不存在";exit
    fi
}

libcopy () {
    local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
    for loop in ${lib_list};do
        local lib_dir=`dirname ${loop}`
        [ -d ${copydir}${lib_dir} ] || mkdir -p ${copydir}${lib_dir}
        [ -f ${copydir}${loop} ] || cp ${loop} ${copydir}${lib_dir}
        echo "${loop}---->文件复制完成"
    done
}

    read -p "请输入一个可执行命令:" cmd
while [ "${cmd}" != "quit" ];do
    if bincopy ${cmd} ;then
    libcopy ${cmd}
    fi
    read -p "请输入一个可执行命令或退出(quit):" cmd
done

2GIF.gif

3、汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
利用函数,实现N片盘的汉诺塔的移动步骤

[root@fengl bin]# cat heneita.sh 
#!/bin/bash

step=0
heneita () {
    [[ ! $1 =~ ^[1-9][0-9]*$ ]] && echo "输入错误,请重新输入碟子的数量" && exit
    if [ $1 -eq 1 ] ; then
        let step++
        echo "$step: move plate $1   $2------>$4"
    else
        heneita "$[$1-1]" $2 $4 $3
        let step++
        echo "$step: move plate $1   $2------>$4"
        heneita "$[$1-1]" $3 $2 $4
    fi
}
read -p "请输入碟子的数量:" number
heneita $number A B C

3GIF.gif

原创文章,作者:苦涩咖啡,如若转载,请注明出处:http://www.178linux.com/38904

(0)
苦涩咖啡苦涩咖啡
上一篇 2016-08-24 21:22
下一篇 2016-08-24 21:22

相关推荐

  • iptables基础概念

    iptables基本概念梳理 前言 netfilter/Iptables (其中包括netfilter和Iptables两个组件)组 成了Linux平台下的包过滤防火墙,它与大多数的Linux自带软 件一样,这个防火墙是免费提供的,它可以代替昂贵的企业级 防火墙来解决实际问题与实际方案,完成封包过滤,封包重定 向和网络地址转换等功能。 一、工作原理 数据包从…

    Linux干货 2016-12-19
  • 例图分析软、硬链接

    在linux系统中存在两种链接方式硬链接和软连接,两种链接方式在系统中是完全不同的模式,本文主要详述两种的区别并给与图示; 创建guo ,lin两个文件,两个文件分别用于演示软连接和硬链接     图一:创建文件   创建软连接guo.ruan1     图二:创建软连…

    Linux干货 2016-10-29
  • 常用RAID级别浅析

    简介:    RAID为独立冗余磁盘阵列的简称,它可以通过软件或硬件技术把多个较小的磁盘整合成一个较大的磁盘。从而实现较大的 磁盘存储,容错及数据保护功能,较快的数据读写等功能. 实现方式:      硬件实现方式:通过bios参数调整来实现      软件实…

    2017-06-17
  • 硬盘及文件系统基础概念

    机械硬盘HDD(Mechanical hard disk) 机械硬盘中所有的盘片都装在一个旋转轴上,每张盘片之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距离比头发丝的直径还小,所有的磁头联在一个磁头控制器上,由磁头控制器负责各个磁头的运动。 磁头(Head): 对硬盘上的数据进行读写操作. 磁道(Track) 当磁盘旋转时,磁头若保持在一个…

    Linux干货 2017-04-09
  • Linux Bash Shell有关变量

    bash 创建一个子bash-n 查看是否有错误-x 逐行显示信息$:显示当前PIDPPID :显示父进程PIDSHLVL :显示当前shell是几级shellpstree 显示进程树-p 同时显示进程号ps -ef 显示进程信息 本地变量 :仅对当前SHELL有效,对子SHELL也无效环境变量:对当前SHELL及子SHELL均有效。 set 显示本地变量和…

    2017-09-16
  • ansible实战示例

    要求:     使用ansible部署以下任务:     (1) 在VS部署主/备模型的keepalived + nginx的负载均衡;     (2) 在RS主机上部署httpd + php + php-mysql;     (3) 在第五台主机上部署mariadb-serve…

    Linux干货 2016-11-11