




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Thizlinux 系统教程 Shell 经典实例-Milo经典小shell1 列目录树的shell脚本如下:#!/bin/sh# dtree: Usage: dtree any directorydir=$1:-.(cd $dir; pwd)find $dir -type d -print | sort -f | sed -e s,$1, -e /$/d -e s,/*/(/*)$,-1, -e s,/*/,| ,g2 while中使用read (file是一个文件)cat file | while read linedoecho $lineecho : Please input any key(s):cstr4read=while truedochr4read=dd if=/dev/tty bs=1 count=1 2/dev/nullstr4read=$str4read$chr4readif $chr4read = ;then break; fidoneecho : |$str4read|done3 将多个空格替换为字符sed s/ */ /g如果空格与tab共存时用sed -e s/:space:space:*/ /g filename4用脚本实现分割文件#!/bin/bashif $# -ne 2 ; thenecho Usage: split file size(in bytes)exitfifile=$1size=$2if ! -f $file ; thenecho $file doesnt existexitfi#TODO: test if $size is a valid integerfilesize=/bin/ls -l $file | awk print $5echo filesize: $filesizelet pieces=$filesize/$sizelet remain=$filesize-$pieces*$sizeif $remain -gt 0 ; thenlet pieces=$pieces+1fiecho pieces: $piecesi=0while $i -lt $pieces ;doecho split: $file.$i:dd if=$file of=$file.$i bs=$size count=1 skip=$ilet i=$i+1doneecho #!/bin/bash mergeecho i=0 mergeecho while $i -lt $pieces ; mergeecho do mergeecho echo merge: $file.$i mergeecho if ! -f $file.$i ; then mergeecho echo merge: $file.$i missed mergeecho rm -f $file.merged mergeecho exit mergeecho fi mergeecho dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i mergeecho let i=$i+1 mergeecho done mergechmod u+x merge5得到上月未日期,格式为YYYYMMDDget_lastday_of_lastmonth()yy=date +%Ymm=date +%m-1|bc $mm -lt 1 & mm=12;yy=expr $yy - 1aaa=cal $mm $yydd=echo $aaa|awk print $NFecho $yy$mm$ddprint $NF的$NF是打印最后一个列。因为awk的内置变量NF是列的总数,而$NF就代表着最后一列6 实现用backup或tar命令来做目录备份需要保持两个目录当中的文件以及属组关系不变。子目录结构不变,通过管道控制tar和backup命令,不需要中间的archive,(考虑到速度以及空间的关系)(cd /source & tar cf - .) |(cd /dest & tar zxfp -)偶没有 backup 命令,但是 tar 用管道可以,tar -cf - dir1 | ( cd dir2; tar -xvf - )搬移大法more aaa.sh#计算两个日期间有多少天#date1,date2:yyyymmdd#Usage:command date1 date2str=$1yy1=echo $str|cut -c 1-4mm1=echo $str|cut -c 5-6dd1=echo $str|cut -c 7-8str=$2yy2=echo $str|cut -c 1-4mm2=echo $str|cut -c 5-6dd2=echo $str|cut -c 7-8count_day=expr $dd2 - $dd1while $yy2 -ne $yy1 -o $mm2 -ne $mm1 domm2=expr $mm2 - 1 $mm2 -eq 0 & mm2=12 & yy2=expr $yy2 - 1aaa=cal $mm2 $yy2bbb=echo $aaa|awk print $NFcount_day=expr $count_day + $bbbdoneecho $count_day7 编写一个只允许用户执行telnet的shell为了监视用户网络操作行为,指定unxi主机给设备管理员登陆,然后用shell控制他。只可以使用telnet命令,其他一概不许,包括cd,ls等。就是一个用来远程登陆的管理平台。我对shell不熟,请指导。.profile中加入:read addrtelnet $addrexit8 判断文件的访问权限是不是600ls -l filename | awk if($1 -rw-) . ls -l filename | grep -rw- -c#!/usr/bin/bash#showmod $# -eq 0 & echo Usage: $0 filelist . ; exit ;show() -d $1 & ls -ld $1 ; -f $1 & ls -la $1 ; | awk umask=0umask_=for(i=1;i %s ,$9,$1,umask_);for file_dir in $*doshow $file_dirdone9 算青蛙的脚本maxcount=$1;count=1;if $# -eq 1 thenwhile $count -le $maxcount do echo $count 只青蛙 $count 张嘴, expr $count * 2只眼睛,expr $count * 4条腿;count=expr $count + 1;done;elseecho usage: sendos countfi10 在SHELL程序中实现按任意键继续在写一个SHELL程序,可是遇到了一个难题,在READ接受输入时,必须按回车键才能确认,而我需要只要按一个键就能得到用户的输入,无须按回车键!有什么好办法呢#!/bin/shget_char()SAVEDSTTY=stty -gstty -echostty rawdd if=/dev/tty bs=1 count=1 2 /dev/nullstty -rawstty echostty $SAVEDSTTYecho Press any key to continue.char=get_char如果你的机器上不认stty raw那么把函数中两处出现的raw换成cbreak。 11 在linux环境下启动时打开numlock想在系统启动时自动打开NumLock,可以在/etc/rc.d/rc.local中加入以下内容:for t in 1 2 3 4 5 6 7 8do setleds +num $t/dev/nulldone12 在shell里如何限制输入的长度举个例子,比如用户输入用户名时只能给他输入8个字符,如果超过了8个字符光标就停止在第八个字符那儿,不继续,一直等待回车只怕要自己来另写一个SHELL了。我现在可以实现到如果输入超出的话光标就停在最后一个字符,但是对于那些输入小于规定位数的那些就没折了,举个例子,比如用户域最长不能超过8位,我输入了6位然后回车,就不会结束,一定要输入完8位按回车才可以结束文件名: input.sh 用法:input.sh 限制的长度例:input.sh 8 即限制输入8位。#!/bin/ksh# Program Name : input.shtrap 1 2 3 5 7 9 15 13getcon()stty raw -echoconchar=dd if=/dev/tty bs=1 count=1 2/dev/nullstty saneecho $concharwhilei=0;clear /dev/ttyecho 13 双机(多机)自动互备份方案问 题:公司有两台LINUX服务器,每个服务器只有一个硬盘。所以备份的问题就显得特别重要。我们装有MySQL数据库。当然同时也要解决MySQL备份的问题。目 的:host 机器最终所有备份都在其上留备份,ship机器保存host机器备份方 法:通过shell脚本,打包相关要备份的文件。然后通过ftp操作下载,上载完成解决方案。两台机器root 通过crontab 让脚本在各自机器定时执行。建议host 每天早上3点执行。建议ship 每天早上6点执行。注意点:两台服务器系统时间最好相差不要超过1小时。此脚本是每周礼拜6执行备份的。当然你也可以修改成每月或每天备份。当然也可以修改成一个增量备份脚本。具体脚本:以下为host机器脚本#/host机器脚本/#! /bin/shHOST=USER=backup_use #ship机器backup_use用户PASSWORD=backup_use #ship机器对应用户密码BACKUPDIR=/home/backup_use/ship #host机器backup_use用户目录BACKUPDIR2=/home/backup_use/host #host机器backup_use用户目录MYSQLPASS=abc #ship 机器MySQL root 用户密码PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/nusphere/MySQL/binDOW=date +%aDM=date +%Y%b%dFILE1=ship-virtual-$DM.tar.gzFILE2=ship-MySQLdata-$DM.tar.gzFILE3=ship-szeasy-$DM.tar.gzFILE4=ship-other-$DM.tar.gz#FIL1=$BACKUPDIR2/host-main-$DM.tar.gzFIL2=$BACKUPDIR2/host-MySQLdata-$DM.tar.gzFIL3=$BACKUPDIR2/host-other-$DM.tar.gz#DIRECTORIE1=/www /home/jjd # 要备份的目录1DIRECTORIE2=/etc /var/named /usr/local/nusphere/apache/conf # 要备份的目录2#if $DOW = Sat ; then # 每个礼拜六完全备份tar -zcpf $FIL1 $DIRECTORIE1tar -zcpf $FIL3 $DIRECTORIE2MySQLdump -all-databases -q -uroot -p$MYSQLPASS |gzip $FIL2ftp -i -n tempfile1sed s/a/ tempfile1 tempfile2awk printf(mv a%s a%04s , $0, $0) tempfile2 tempfile3chmod 700 tempfile3./tempfile3rm tempfile*$chmod test-ls a*|awk num=substr($1,2,length($1)-1);printf mv %s a%04d ,$1,numrename.shsh rename.sh-for file in a*donewfile=echo $file | awk printf a%04d, substr($1, 2, length($1)-1)mv $file $newfiledone给个不用awk的,效率会低一点ls -1 a*|while read jdonum=echo $j|cut -b 2-num=printf a%04s $nummv $j $numdone-稍微缩减一下:for file in a*domv $file echo $file|awk printf a%04d, substr($1,2,length($1)-1)done如果a1,a2,a3.等文件是各自有不同的扩展名呢?就像a1.pxx,a2,baa,a3.tga.这样是不是可以呢:for file in a*donam=echo $file|cut -d. -f1exe=echo $file|cut -d. -f2mv $file echo $nam|awk printf a%04d, substr($1,2,length($1)-1).$exedone15 禁止从一个IP登录的shell解决方案0:用shell完全可以解决,如果有tcpwrapper的系统,可以直接加/etc/hosts.deny解决方案1:在/etc/profile里加一段shell就可以了(sco openserver)这是我写的只要求本C段登陆的shell,改改就可以了.who=who am i|awk print $1myterm=who am i|awk print substr($2,4,2)if x$who = xroot thensubnet=finger|grep $myterm|awk print substr($8,1,8)elsesubnet=finger|grep $myterm|awk print substr($7,1,8)fitest x$subnet != x & test x$who != xroot & test x$subnet != x46.8.44. & echo Please login from local network & exit 16 eval用法三例# shell:/bin/sh #例一:#寻找符合条件的变量名,然后将该变量的值赋予另一变量v1=aaav2=bbbc=1if $c -eq 1 thenvname=v$c #找到符合条件的变量名为v1eval vvv=$vname ; echo vvv: $vvv #将变量v1的值赋予vvv,即,使vvv=aaaeval vvv=$vname ; echo vvv: $vvv #将变量v1的值赋予vvv,即,使vvv=aaa#eval vvv=$vname ; echo vvv: $vvv #错误用法fi#例二:#以变量v1的值aaa作为变量名,将变量vaaa的值赋予这一新定义的变量aaav1=aaa ; vaaa=This is aaa#eval $v1=$vaaa ; echo aaa: $aaa #错误用法#eval $v1=$vaaa ; echo aaa: $aaa #错误用法eval $v1=$vaaa ; echo aaa: $aaa#例三:#以变量v1的值aaa作为变量名,并将变量名字串作为值赋予自身v1=aaa ; vaaa=This is aaaeval $v1=$v1 ; echo aaa: $aaa #与例二的错误用法不同,这一用法是正确的eval $v1=$v1 ; echo aaa: $aaa #与例二的错误用法不同,这一用法是正确的#区别在于,例二中的vaaa的值中间有空格eval $v1=$v1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 漫画版新质生产力
- 民族歌剧《沂蒙山》课件
- 科学企业家:新质生产力的引领者
- 2025年眼科常见眼病诊断与治疗知识考核答案及解析
- 2025年护理学实际操作技能考核模拟试卷答案及解析
- 2025年整形外科手术器械识别模拟考试卷答案及解析
- 2025年生理学生理生化参数测定试卷答案及解析
- 华池县创建省级园林城市实施方案
- 2025年中医儿科疾病辨治与药膳养生模拟考试卷答案及解析
- 2025年中医推拿治疗技术应用考查答案及解析
- 国家汉语主题词表
- 新疆地名中英对照
- 记叙文中的并列式结构课件
- 新媒体运营实务完整全套课件
- 桩基础平法施工图(平法施工图识读)
- GB/T 9113-2010整体钢制管法兰
- GB/T 23338-2018内燃机增压空气冷却器技术条件
- 海姆立克急救法完整版本课件
- 控压钻井技术及实践培训讲义工艺课件
- 厚度仪点检表
- 自然拼读法在小学英语教学中的应用的实践研究
评论
0/150
提交评论