会员登陆  支付方式  联系我们  在线客服  网站地图       
首页 关于域浪 互联网数据中心业务、主机托管、主机租用、机架租用、带宽租用、机房介绍、机房对比、CCN网络加速 adsl专线、深圳adsl专线 虚拟主机、域名注册、数据库、企业邮局、动态域名 网络安全、网络临近平台、安全服务、防火去墙租用、安全产品、域浪抗DDOS防火墙、NetScreen防火墙 技术支持  
   当前位置:首页 >> 技术支持 >> SHELL技巧 >> Shell 编程实例集锦
 
精华文章
    AIX shell工具集  
    I/O重定向 详解及例子  
    Shell 编程实例集锦  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux Shell 下的输出...  
    几个shell程序设计小知...  
    几种常见shell简介  
    shell基础十二篇  
    Shell编程基础  
    Bourne Shell及shell编...  
    shell命令(三)  
    shell命令(二)  
    shell命令(一)  
    shell基础:输入和输出...  
    shell命令  
    shell编程入门及脚本测...  
    Linux Shells简介  
    TCSH Shell编程  
    Korn Shell编程  
    Shell基础及编程(二)  
    Shell基础及编程(一)  
    shell基础知识  
    shell编程例子 -- 一个...  
    在LinuxShell程序中进...  
    SHELL病毒简介  
  更多>>  
   SHELL技巧
 Shell 编程实例集锦
如何将一个 index 文件中的空链接删除?

    在目录 /doc/Art_and_Photos/photo/NASA-Astronomy_Picture_of_the_Day 中只有有限的几个文件,而 archivepix.html 文件中却链接了两千多个文件,我们的目标就是要把不存在的文件链接删除掉。 



#!/bin/tcsh -f



# 从当前目录中查找有哪些可用文件。find 不支持正则表达式 \{\}

set tmp=`find . -type f -maxdepth 1 -name "ap[0-9][0-9][0-9][0-9][0-9][0-9].html" `



# 将查找结果 ./ap000303.html 转换为 ap000303.html

set ff1=`echo $tmp | sed -e 's/\.\/\(ap[0-9]\{6\}\.html\)/\1/g' `



# 在文件 archivepix.html 中查找包含类似 ap000303.html 的行,并将其导入临时文件 ftmp 中

grep 'ap[0-9]\{6\}\.html' archivepix.html >ftmp



# 将 ftmp 中的每一行转换为 ap000303.html 的形式,这样 ff1 和 ff2 中的字符串在形式上就是相同的了。

set ff2 = ` sed -e 's/.*\(ap[0-9]\{6\}\.html\).*/\1/g' ftmp`

rm ftmp -f



# 比较变量 ff1 和 ff2 的内容,如果一个字符串只存在于 ff2 中,那么就把文件 archivepix.html 中含有该字符串的行删除掉。

foreach f2 ($ff2)

  echo $f2

  set flag=0

  foreach f1 ($ff1)

    if ($f2 == $f1) then

      set flag=1

    endif

  end

  if($flag == 0) then

    sed -e '/'$f2'/d' archivepix.html >ftmp  

  # 此句最关键之处在于'$f2'可用于正则表达式。

    mv ftmp archivepix.html -f

  endif

end



如何将一个目录中的所有文件链接到网页中?

只要将下列程序的输出导到一个文件中,再将其拷至网页的相应位置就可以了。这里最关键的是看双引号如何输出(\")。 



#!/bin/tcsh -f

set dd = "/doc/Art_and_Photos/Flash/flash/AGui"

set ffff = `find $dd -type f `

set n=0

foreach f ($ffff)

@ n++

echo $f

echo '< a href='\"$f\"'<'$n',</a>'>> AGui.html

end



如何为一堆文件换名字?

    在吴老师的笔记心得中介绍了张林波的高招,但那是 bash 的,而且是以命令行形式给出的。为了便于理解,我将其改写为 tcsh 格式,并将其置于脚本文件之中,更利于使用。 



#!/bin/tcsh -f      

# -f 说明直接运行该文件,而不会先运行 .cshrc 进行初始化

rm tmp_file -f      

# 确保该文件不存在

foreach fold (*.jpg.*)

set fnew = ` echo $fold | sed -e "s/\.jpg\.\(.*\)/-\1.jpg/g" ` 

# 精华之处

echo "mv $fold $fnew -f " >>tmp_file

end

chmod a+x tmp_file

./tmp_file

rm tmp_file -f



    在这个脚本文件中,关键是“精华之处”。它的意义是:首先将要修改的文件名($fold)通过管道( | ) 传给流编辑器(sed),流编辑器对文件名进行处理,其各项的具体意义为: 

set fnew = ` echo $fold | sed -e "s/\.jpg\.\(.*\)/-\1.jpg/g" `

sed -e            命令+选项  表示允许多点编辑

s/re/string/      用 string 替换正则表达式 re

/\.jpg\.\(.*\)/   “\.”表示一个真正的点,“\.jpg\.” 代表文件名中的“ .jpg.”;“\(.*\)” 中的‘.’匹配一个非换行符的字符,‘*’匹配 0 个或多个“先前”字符,

     它与 shell 的通配符完全不同,shell 的通配符代表 0 个或多个“任意”字符。

    “.*”所代表的内容被设为“标签 1”,可在需要的地方用“\1”引用。值得注意

           的是:“.*”决不能用“*”来代替,因为“*”将表示任意个“\.”。

/-\1.jpg/         “\1”代表“标签 1”的内容

g                   表示行内全面替换



这里还有一个地方需要提醒,那就是将 `echo ...` 引起来的不是单引号,而是键盘左上角标有 “~ ` ”上的撇号. 



如何解决网页中字体放大时出现重叠的问题?



方案一:适用于单层目录 

#!/bin/tcsh -f

set dir=`ls .`

foreach d  ($dir)

  if( -d $d) then          # 判断是否为目录

    cd  $d

    echo "cd $d"

    foreach f (*.htm *.html)

      sed -e '/[0-9]pt/d' $f > ftmp  # 删除所有包含 9pt、12pt 等关键词的行

      mv ftmp $f -f

    end

    cd ..

  endif

end



方案二:适用于多层目录 



#!/bin/tcsh -f

set SearchPath = "/doc/Reading/everything/武侠/梁羽生"

set files=`find $SearchPath -type f -name "*.htm*" `

foreach f ($files)

  echo $f

  sed -e '/[0-9]pt/d' $f > ftmp

  mv ftmp $f -f

end



如何将一个目录中所有文件名由大写变为小写

我们以目录 tmp 为例 



1. 进入 tmp 目录的上一级目录

2. zip -r tmp.zip  tmp/*

3. mv tmp tmp-old   (这是为了安全起见,此处也可改为 rm -r -f tmp )

4. unzip -LL tmp.zip



这样,tmp 目录中的文件名就全改为小写了。在确认无误后,可将 tmp-old 目录删除。 



如何将一个文件中的内容由大写变为小写

最简单的做法是在 ~/.cshrc 中设如下命令: 

alias tr  'tr A-Z a-z< \!* >ttttmp; mv ttttmp \!* -f'

此处别名必须为 tr,其他的就不行,不知为什么。当需要对文件进行操作时,敲如下命令: 

tr  [filename]

    该命令在命令行中运行没有任何问题,但是如果将其放在一个 shell script 文件中,然后将该文件的属性改为可执行并执行之的话,你会发现用 alias 设置的简化命令全部失效。解决办法为: 

source  shell_file

此处还顺便说一句,sh 命令运行的是 bash 文件。 



如何使系统每隔大约3小时自动激活一次声卡

1. 由于我们所用的声卡驱动程序是一个试用版的,在一星期以内,它有3小时的有效时间(尚可接受)。但超过一个星期以后,有效时间就只有20分钟了,那是绝对无法忍受的!吴首教为此感到义愤填膺,于2003年9月1日“坐台”完毕后,组建攻关小组并亲自挂帅,带领组员王某人经过“极其艰苦” 的奋斗,终于攻克了这一难题。短命的攻关小组在完成了其历史使命,并开完“非典声卡激活经验总结表彰大会”后,就地解散。茫茫天地间只留下了如下解决方案: 



(1) 建立 shell 脚本文件 opensound 

#!/bin/tcsh -f

while(1)

set datesave=`date +%m%d%H%M%Y`

date 082500002003

/usr/lib/oss/soundoff

/usr/lib/oss/soundon

date $datesave

sleep 10800

end

(2) 将 opensound 的属性改为所有人均可执行, 命令为: 

chmod  a+x  opensound

(3) 将 opensound 拷贝至 /usr/local/bin 

(4) 在 /etc/rc.d/rc.local 中加入 

/usr/local/bin/opensound >&/dev/null&

(5) 重新启动计算机。然后我们就能永远听到美妙的声音啦!!! (此事又一次证明: 道高一尺, 魔高一丈!) 



2. 曾经我以为这一问题已圆满解决,但在使用过程中却问题多多,人生最痛苦的事莫过如此。究其原因,都是 soundoff 惹得祸。为了声音永驻,我将不惜 CPU 时间与其试比高。 



#!/bin/tcsh -f

set datesave=`date +%m%d%H%M%Y`

date 082500002003

/usr/lib/oss/soundoff

/usr/lib/oss/soundon

date $datesave

sleep 8000                   

# 以上是为了在系统启动时激活声卡



while(1)

  /usr/lib/oss/soundoff >& out

  set flag=`cat out`

  rm out -f

  set N=0

  if("$flag" != "") then     

# flag 不是空串说明 soundoff 执行失败

    while(2)

      @ N++

      /usr/lib/oss/soundoff >& out

      set flag=`cat out`

      rm out -f

      if("$flag" == "") then

        echo "soundoff succeed"

        break

      else

        echo "$N   soundoff failed"

        sleep 5

      endif

    end

  endif

  set datesave=`date +%m%d%H%M%Y`

  date 082500002003

  /usr/lib/oss/soundon

  date $datesave

  sleep 8000

end



还有问题请来论坛寻求帮助:http://www.xxlinux.com/bbs/
  • 上一篇文章: I/O重定向 详解及例子
  • 下一篇文章: Linux下Shell基础知识深入浅出(1)
  • 域浪网络ISP经营许可证 深圳地址:深圳市罗湖区宝安北路国际商品交易大厦七楼C30室
    Tel:0755-82266883/82267566 Fax:0755-82261966
    邮编:518000 
                        Copyright © 2006-2008 elang.cn All Rights Reserved 深圳市域浪网络技术有限公司版权所有