博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell之脚本练习
阅读量:6985 次
发布时间:2019-06-27

本文共 6602 字,大约阅读时间需要 22 分钟。

 

脚本需求集合贴-自主开发的
对频繁执行的任务有编写脚本的价值对单次执行的任务就用笨的,简单的办法1.对asterisk写一个脚本查日志输入日期--能够输出对应日期的日志输入多个条件--能够输出and或者or的结果2.修改配文,按行去弄通过一个脚本可以修改多个配置文件输入配置文件名,再输入行号,再输入操作类型,增删改查,再输入内容验证输出结果是否正确。

 

 

做一个需求流程图需求分析-方案设计-具体实现训练点sed,echo,test,if,while,shift1.需求分析:练习test的-d方案设计:体现的是思路,先定义一个变量,用条件去判断具体实现:输入:如下[root@250-shiyan sh]# cat > mytesta=/root/sh/sedif [ -d $a ]thenecho "$a is a directory"fi输出:正确满意[root@250-shiyan sh]# chmod u+x mytest[root@250-shiyan sh]# ./mytest/root/sh/sed is a directory2.需求分析:上一步虽然实现,但只有一个目录,并且是死的,不灵活。并且如果不是目录,没有相应的输出。方案设计:把目录换成文件,加入非目录时的输出。具体实现:用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 file3.需求分析:将目录在脚本里定死,不方便,如何去在命令行传入文件名参数,这样就方便了。方案设计:具体实现:用sed在命令行直接修改源文件,注释掉第一行输入:如下[root@250-shiyan sh]# sed -i -e '1s/a/#&/' -e 's/\$a/\$1/' mytest[root@250-shiyan sh]# cat mytest#a=/root/sh/memif [ -d $1 ]thenecho "$1 is a directory"else echo "$1 is a file"fi输出:正确满意[root@250-shiyan sh]# ./mytest forfor is a file[root@250-shiyan sh]# ./mytest awkawk is a directory4.需求分析:如果能在命令行测试多个文件或目录就好了方案设计: 每次循环时加入一个条件判断即可,并相应输出。具体实现:用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 mytest1while [ -n "$*" ] 或者 until [ $# -eq 0 ]doif [ -d $1 ]thenecho -e "\033[31m$1\033[m\t is a directory"else echo -e "\033[32m$1\033[m\t is a file"fishiftdone 输出:正确满意[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.00USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHATroot     pts/0    192.168.2.80     22:35    0.00s  0.13s  0.00s wroot     pts/1    192.168.2.80     22:57    4:23   0.04s  0.00s vi install.log####知道了有个用户在用vi程序,然后查看vi占用的程序,知道了是1472这个进程[root@localhost ~]# lsof -c viCOMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAMEvi      1472 root  cwd    DIR  253,0     4096 130306 /rootvi      1472 root  rtd    DIR  253,0     4096      2 /vi      1472 root  txt    REG  253,0   764088 521383 /bin/vivi      1472 root  mem    REG  253,0    65928 521249 /lib64/libnss_files-2.12.sovi      1472 root  mem    REG  253,0 99158576 784025 /usr/lib/locale/locale-archivevi      1472 root  mem    REG  253,0    18712 521281 /lib64/libattr.so.1.1.0vi      1472 root  mem    REG  253,0    19536 521239 /lib64/libdl-2.12.sovi      1472 root  mem    REG  253,0   135896 521277 /lib64/libtinfo.so.5.7vi      1472 root  mem    REG  253,0  1921216 521233 /lib64/libc-2.12.sovi      1472 root  mem    REG  253,0    31280 521299 /lib64/libacl.so.1.1.0vi      1472 root  mem    REG  253,0   140096 521273 /lib64/libncurses.so.5.7vi      1472 root  mem    REG  253,0   122040 521307 /lib64/libselinux.so.1vi      1472 root  mem    REG  253,0   596264 521241 /lib64/libm-2.12.sovi      1472 root  mem    REG  253,0   154520 521226 /lib64/ld-2.12.sovi      1472 root    0u   CHR  136,1      0t0      4 /dev/pts/1vi      1472 root    1u   CHR  136,1      0t0      4 /dev/pts/1vi      1472 root    2u   CHR  136,1      0t0      4 /dev/pts/1vi      1472 root    4u   REG  253,0    16384 137725 /root/.install.log.swp####接着查看进程树,找进程1472的父子关系[root@localhost ~]# pstree -pinit(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:24LOGIN      tty2         2015-02-04 22:24              1062 id=2LOGIN      tty1         2015-02-04 22:34              1374 id=1LOGIN      tty3         2015-02-04 22:24              1064 id=3LOGIN      tty4         2015-02-04 22:24              1066 id=4LOGIN      tty5         2015-02-04 22:24              1073 id=5LOGIN      tty6         2015-02-04 22:24              1076 id=6root     + 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.shecho "Please input arguements is $# "echo  "What you input : "while [[ $* != "" ]]doecho $1shiftdone输出:正确满意[root@250-shiyan frag]# ./aa.sh 34j 565 6767 23424 234234Please input arguements is 5What you input :34j5656767234242342342.
很多情况都是这种方式,都是将变量,常量或函数集体存放,然后统一调用,用点去调用[root@250-shiyan aa]# cat /etc/init.d/network# Source function library.. /etc/init.d/functionsif [ ! -f /etc/sysconfig/network ]; then    exit 6fi. /etc/sysconfig/networkif [ -f /etc/sysconfig/pcmcia ]; then        . /etc/sysconfig/pcmciafi
 
需求分析:将所有变量与常量写入到一个文件,然后在脚本文件中调用此文件中的变量方案设计:具体实现:输入:如下[root@250-shiyan aa]# cat varisf=3eth=`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. varisecho $i[root@250-shiyan aa]# cat until.sh[ -f varis ] && . varisuntil [ $f -lt 0 ]doecho $f((f--))done输出:正确满意[root@250-shiyan aa]# bash math.sh3.33[root@250-shiyan aa]# bash until.sh32103.[root@250-shiyan frag]# cat ui.shecho $(uname)num=1000uname(){    echo "test!"    ((num++))    return 100}testvar(){    local num=10    ((num++))    echo $num}unameecho $?echo $numtestvarecho $num[root@250-shiyan frag]# bash ui.shLinuxtest!10010011110014.需求分析:周期执行自动更改密码,更改后发邮件通知,放入crontab中定期执行。[root@250-shiyan frag]# cat chpa1.sh(date|md5sum|tee -a cccc -)|passwdtail -1 cccc|mail -s "pa" createyuan@sohu.com

 

转载于:https://www.cnblogs.com/createyuan/p/4228068.html

你可能感兴趣的文章
【剑指offer】顺时针打印矩阵
查看>>
以太坊交易池处理逻辑
查看>>
怎么将图片上传封装成指令?
查看>>
leetcode讲解--861. Score After Flipping Matrix
查看>>
干货 | 金融级互联网产品持续交付的挑战与应对
查看>>
一道面试题引发的思考 --- 理解 new 运算符
查看>>
聊聊JavaScript和Scala的表达式 Expression
查看>>
[原]数据科学教程: 如何使用 mlflow 管理数据科学工作流
查看>>
npm上创建发布package
查看>>
分析 JavaScript 的数据类型与变量
查看>>
解决JS文件引用路径多层查找
查看>>
FE.TEST-前端测试初探
查看>>
超详细Dkhadoop虚拟机安装图文教程
查看>>
排序算法上——冒泡排序、插入排序和选择排序
查看>>
JAVA 8 函数式接口--Supplier
查看>>
Android HTTP
查看>>
Dockerfile多阶段构建原理和使用场景
查看>>
476-数字的补数
查看>>
SQLServer之删除索引
查看>>
七牛云赵之健:多维度融合赋能视频 AI 的实践
查看>>