脚本需求集合贴-自主开发的
对频繁执行的任务有编写脚本的价值对单次执行的任务就用笨的,简单的办法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