• shell之脚本练习


    脚本需求集合贴-自主开发的
    对频繁执行的任务有编写脚本的价值
    对单次执行的任务就用笨的,简单的办法
    
    1.对asterisk写一个脚本
    查日志
    输入日期--能够输出对应日期的日志
    输入多个条件--能够输出and或者or的结果
    
    2.修改配文,按行去弄
    通过一个脚本可以修改多个配置文件
    输入配置文件名,再输入行号,再输入操作类型,增删改查,再输入内容
    验证输出结果是否正确。
    做一个需求流程图
    
    需求分析-方案设计-具体实现
    
    训练点
    sed,echo,test,if,while,shift
    
    1.
    需求分析:练习test的-d
    方案设计:体现的是思路,先定义一个变量,用条件去判断
    具体实现:
    输入:如下
    [root@250-shiyan sh]# cat > mytest
    a=/root/sh/sed
    if [ -d $a ]
    then
    echo "$a is a directory"
    fi
    输出:正确满意
    [root@250-shiyan sh]# chmod u+x mytest
    [root@250-shiyan sh]# ./mytest
    /root/sh/sed is a directory
    
    2.
    需求分析:上一步虽然实现,但只有一个目录,并且是死的,不灵活。并且如果不是目录,没有相应的输出。
    方案设计:把目录换成文件,加入非目录时的输出。
    具体实现:用sed在命令行直接修改源文件。即可
    要点:-e,多次编辑要用到。
    输入:如下
    [root@250-shiyan sh]# sed -i -e 's/sed/mem/' -e '/echo/a\else echo "$a is a file"' mytest
    输出:正确满意
    [root@250-shiyan sh]# ./mytest
    /root/sh/mem is a file
    
    3.
    需求分析:将目录在脚本里定死,不方便,如何去在命令行传入文件名参数,这样就方便了。
    方案设计:
    具体实现:用sed在命令行直接修改源文件,注释掉第一行
    输入:如下
    [root@250-shiyan sh]# sed -i -e '1s/a/#&/' -e 's/$a/$1/' mytest
    [root@250-shiyan sh]# cat mytest
    #a=/root/sh/mem
    if [ -d $1 ]
    then
    echo "$1 is a directory"
    else echo "$1 is a file"
    fi
    输出:正确满意
    [root@250-shiyan sh]# ./mytest for
    for is a file
    [root@250-shiyan sh]# ./mytest awk
    awk is a directory
    
    4.
    需求分析:如果能在命令行测试多个文件或目录就好了
    方案设计: 每次循环时加入一个条件判断即可,并相应输出。
    具体实现:用while循环与shift来实现位置参数个数的不确定,
    要点:until循环和while循环的结构基本相同,但是until是判断条件表达式为假时才继续循环!
    难点:
    -n是用来测试字符串是否为空的
    $# 位置参数的个数,shift后个数每次减1个。 $
    * 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm 此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm. 输入:如下,第一行用while或until都可以 [root@250-shiyan sh]# vi mytest1 while [ -n "$*" ] 或者 until [ $# -eq 0 ] do if [ -d $1 ] then echo -e "33[31m$133[m is a directory" else echo -e "33[32m$133[m is a file" fi shift done
    输出:正确满意 [root@250-shiyan sh]# ./mytest awk conn eth.sh mem sed
    awk      is a directory
    conn     is a file
    eth.sh   is a file
    mem      is a file
    sed      is a directory

    目的:查看别的进程在做什么,重在处理一个目的的思路,可能有多种思路,但要沿着每条思路走下去,一探究竟。
    
    ####查看当前登录用户
    [root@localhost ~]# w
     23:10:41 up 46 min,  2 users,  load average: 0.00, 0.00, 0.00
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    192.168.2.80     22:35    0.00s  0.13s  0.00s w
    root     pts/1    192.168.2.80     22:57    4:23   0.04s  0.00s vi install.log
    ####知道了有个用户在用vi程序,然后查看vi占用的程序,知道了是1472这个进程
    [root@localhost ~]# lsof -c vi
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
    vi      1472 root  cwd    DIR  253,0     4096 130306 /root
    vi      1472 root  rtd    DIR  253,0     4096      2 /
    vi      1472 root  txt    REG  253,0   764088 521383 /bin/vi
    vi      1472 root  mem    REG  253,0    65928 521249 /lib64/libnss_files-2.12.so
    vi      1472 root  mem    REG  253,0 99158576 784025 /usr/lib/locale/locale-archive
    vi      1472 root  mem    REG  253,0    18712 521281 /lib64/libattr.so.1.1.0
    vi      1472 root  mem    REG  253,0    19536 521239 /lib64/libdl-2.12.so
    vi      1472 root  mem    REG  253,0   135896 521277 /lib64/libtinfo.so.5.7
    vi      1472 root  mem    REG  253,0  1921216 521233 /lib64/libc-2.12.so
    vi      1472 root  mem    REG  253,0    31280 521299 /lib64/libacl.so.1.1.0
    vi      1472 root  mem    REG  253,0   140096 521273 /lib64/libncurses.so.5.7
    vi      1472 root  mem    REG  253,0   122040 521307 /lib64/libselinux.so.1
    vi      1472 root  mem    REG  253,0   596264 521241 /lib64/libm-2.12.so
    vi      1472 root  mem    REG  253,0   154520 521226 /lib64/ld-2.12.so
    vi      1472 root    0u   CHR  136,1      0t0      4 /dev/pts/1
    vi      1472 root    1u   CHR  136,1      0t0      4 /dev/pts/1
    vi      1472 root    2u   CHR  136,1      0t0      4 /dev/pts/1
    vi      1472 root    4u   REG  253,0    16384 137725 /root/.install.log.swp
    ####接着查看进程树,找进程1472的父子关系
    [root@localhost ~]# pstree -p
    init(1)─┬─auditd(895)───{auditd}(896)
            ├─crond(1047)
            ├─master(1037)─┬─pickup(1043)
            │              └─qmgr(1044)
            ├─mingetty(1062)
            ├─mingetty(1064)
            ├─mingetty(1066)
            ├─mingetty(1073)
            ├─mingetty(1076)
            ├─mingetty(1374)
            ├─rsyslogd(911)─┬─{rsyslogd}(912)
            │               ├─{rsyslogd}(914)
            │               └─{rsyslogd}(915)
            ├─sshd(960)─┬─sshd(1375)───bash(1379)───pstree(1498)
            │           └─sshd(1428)───bash(1432)───vi(1472)
            └─udevd(386)─┬─udevd(1072)
                         └─udevd(1075)
    ####杀掉vi
    [root@localhost ~]# kill -9 1472
    ####杀掉1432的bash,也意味着关闭了那个终端
    [root@localhost ~]# kill -9 1432
    
    ####这一步可以直接关闭想要关闭的终端。先查看再kill就行了。
    查看有两个用户在登录,并且它们的bash pid可以显示,点表示现在忙,例如vi一个文件之类的都显示为点,空闲时显示为 小时:分钟
    [root@localhost ~]# who -a
               system boot  2015-02-04 22:24
               run-level 3  2015-02-04 22:24
    LOGIN      tty2         2015-02-04 22:24              1062 id=2
    LOGIN      tty1         2015-02-04 22:34              1374 id=1
    LOGIN      tty3         2015-02-04 22:24              1064 id=3
    LOGIN      tty4         2015-02-04 22:24              1066 id=4
    LOGIN      tty5         2015-02-04 22:24              1073 id=5
    LOGIN      tty6         2015-02-04 22:24              1076 id=6
    root     + pts/0        2015-02-04 22:35   .          1379 (192.168.2.80)
    root     + pts/1        2015-02-04 22:57   .          1432 (192.168.2.80)
    [root@localhost ~]# kill -9 1432
    训练点
    特殊变量,while,shift,until,local,return,function.
    在脚本文件内部定义
    从命令行传递参数
    从文件传递参数
    
    1.
    需求分析:将命令行参数逐行打印
    方案设计:使用特殊变量,从命令行传递参数
    具体实现:
    输入:如下
    [root@250-shiyan frag]# cat >aa.sh
    echo "Please input arguements is $# "
    echo  "What you input : "
    while [[ $* != "" ]]
    do
    echo $1
    shift
    done
    输出:正确满意
    [root@250-shiyan frag]# ./aa.sh 34j 565 6767 23424 234234
    Please input arguements is 5
    What you input :
    34j
    565
    6767
    23424
    234234
    
    2.
    很多情况都是这种方式,都是将变量,常量或函数集体存放,然后统一调用,用点去调用
    [root@250-shiyan aa]# cat /etc/init.d/network
    # Source function library.
    . /etc/init.d/functions
    
    if [ ! -f /etc/sysconfig/network ]; then
        exit 6
    fi
    
    . /etc/sysconfig/network
    
    if [ -f /etc/sysconfig/pcmcia ]; then
            . /etc/sysconfig/pcmcia
    fi
    
    
    
    需求分析:将所有变量与常量写入到一个文件,然后在脚本文件中调用此文件中的变量
    方案设计:
    具体实现:
    输入:如下
    [root@250-shiyan aa]# cat varis
    f=3
    eth=`ifconfig eth0|grep "TX bytes"|gawk '{print $6}'|cut -d ":" -f2`
    i=`echo "scale=2;$f*1.11"|bc`
    [root@250-shiyan aa]# cat math.sh
    . varis
    echo $i
    [root@250-shiyan aa]# cat until.sh
    [ -f varis ] && . varis
    until [ $f -lt 0 ]
    do
    echo $f
    ((f--))
    done
    输出:正确满意
    [root@250-shiyan aa]# bash math.sh
    3.33
    [root@250-shiyan aa]# bash until.sh
    3
    2
    1
    0
    
    3.
    [root@250-shiyan frag]# cat ui.sh
    echo $(uname)
    num=1000
    uname()
    {
        echo "test!"
        ((num++))
        return 100
    }
    testvar()
    {
        local num=10
        ((num++))
        echo $num
    }
    uname
    echo $?
    echo $num
    testvar
    echo $num
    [root@250-shiyan frag]# bash ui.sh
    Linux
    test!
    100
    1001
    11
    1001
    
    4.
    需求分析:周期执行自动更改密码,更改后发邮件通知,放入crontab中定期执行。
    
    [root@250-shiyan frag]# cat chpa1.sh
    (date|md5sum|tee -a cccc -)|passwd
    tail -1 cccc|mail -s "pa" createyuan@sohu.com
  • 相关阅读:
    哈希表及其应用分析
    程序员常用的查找算法
    程序猿必备排序算法及其时间复杂度分析
    递归和回溯求解8皇后问题
    链表种类及其常用操作
    为什么要使用稀疏矩阵??
    微服务项目持续集成部署流程简介
    微服务项目的docker自动化部署流程
    (高考标准分)数据拟合==>多项式方程==>excel公式算成绩(标准分)
    awk用名称对应关系批量重命名
  • 原文地址:https://www.cnblogs.com/createyuan/p/4228068.html
Copyright © 2020-2023  润新知