LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: KornLee

【shell脚本欣赏区】:[展示你的作品的好去处!欢迎投帖]

[复制链接]
发表于 2006-9-30 15:06:57 | 显示全部楼层
我写的第一个脚本,用于统计系统中所有已安装的软件包,相应命令,和软件包涉及的目录:

for x in `rpm -qa|gawk -F "-0" '{print $1}'|gawk -F "-1" '{print $1}'|gawk -F "-2" '{print $1}'|gawk -F "-3" '{print $1}'|gawk -F "-4" '{print $1}'|gawk -F "-5" '{print $1}'|gawk -F "-6" '{print $1}'|gawk -F "-7" '{print $1}'|gawk -F "-8" '{print $1}'|gawk -F "-9" '{print $1}'`;do \
whereis $x>>softwarelist-all;
done
grep bin ./softwarelist-all>>softwarelist-exec

gawk这一段比较笨,希望兄弟们指点改进。产生的文件softwarelist-exec里面就是系统上除了自制脚本外的所有可执行命令。
回复 支持 反对

使用道具 举报

发表于 2006-10-11 20:28:59 | 显示全部楼层
#!/bin/bash
#
# 目的:监视文件系统,如果使用量大于$FS_MAX,则发出警报

FS_MAX=85
FS_LOGFILE=/tmp/fs_logfile
FS_OUTFILE=/tmp/fs_outfile
>$FS_LOGFILE                #初试化警报文件
>$FS_OUTFILE                #初试化输出文件

usage()
{
        printf "\nUSAGE: `basename $0` FS_MAX(85)\n"
}

#将文件系统的结果输出到$FS_OUTFILE

outfile()
{
        /bin/df -k | tail -n +2 | grep -v "tmpfs" | sed "s/\%//g" | gawk '{print $1,$5,$6}' > $FS_OUTFILE
}

#测试,如果大于FS_MAX,则将日志发送到日志文件

testfile()
{
        while read FILESYSTEM FSPERCENT FSMOUNT
        do
                if [ $FSPERCENT -gt $FS_MAX ]
                then
                        echo "$FILESYSTEM mounted on $FSMOUNT is bigger than $FS_MAX%. Please be careful!" > $FS_LOGFILE
                fi
        done < $FS_OUTFILE
}

if [ $# -ne 0 -a $# -ne 1 ]
then
        usage
        exit 1
fi

outfile
testfile

if [ -s $FS_LOGFILE ]
then
        cat $FS_LOGFILE
        mail root < $FS_LOGFILE
fi
exit 0
回复 支持 反对

使用道具 举报

发表于 2006-10-14 13:32:16 | 显示全部楼层
#!/bin/bash
#
# 目的:监视文件系统,如果使用量大于$FS_MAX,则发出警报

FS_MAX=85
FS_LOGFILE=/tmp/fs_logfile
FS_OUTFILE=/tmp/fs_outfile
>$FS_LOGFILE                #初试化警报文件
>$FS_OUTFILE                #初试化输出文件

usage()
{
        printf "\nUSAGE: `basename $0` FS_MAX(85)\n"
}

#将文件系统的结果输出到$FS_OUTFILE

outfile()
{
        /bin/df -k | tail -n +2 | grep -v "tmpfs" | sed "s/\%//g" | gawk '{print $1,$5,$6}' > $FS_OUTFILE
}

#测试,如果大于FS_MAX,则将日志发送到日志文件

testfile()
{
        while read FILESYSTEM FSPERCENT FSMOUNT
        do
                if [ $FSPERCENT -gt $FS_MAX ]
                then
                        echo "$FILESYSTEM mounted on $FSMOUNT is bigger than $FS_MAX%. Please be careful!" > $FS_LOGFILE
                fi
        done < $FS_OUTFILE
}

if [ $# -ne 0 -a $# -ne 1 ]
then
        usage
        exit 1
fi

outfile
testfile

if [ -s $FS_LOGFILE ]
then
        cat $FS_LOGFILE
        mail root < $FS_LOGFILE
fi
exit 0
回复 支持 反对

使用道具 举报

发表于 2006-11-9 18:40:58 | 显示全部楼层
Post by LYOO
不错!用Linux就该多写写脚本,天天想着怎么玩X,不如去装Windows算了

说的好!!顶!!
回复 支持 反对

使用道具 举报

发表于 2006-12-12 12:39:49 | 显示全部楼层
真的不错.但是好多都看不懂!
回复 支持 反对

使用道具 举报

发表于 2006-12-19 11:43:59 | 显示全部楼层
好东西!
不过我觉得学习shell的最好的办法就是通读系统提供的一些脚本!!
回复 支持 反对

使用道具 举报

发表于 2006-12-20 12:40:42 | 显示全部楼层

切换网卡地址的shell

用vmware经常在不同网络中改配置,很麻烦。
比如我在家用adsl或者有时是dhcp获取地址,这个时候虚拟机就得用hostonly共享一块网卡上网,在公司我可直接设置为bridged模式。为了一劳永逸,更改如下:

1.在vmware菜单的vm-settings增加一块网卡eth1,并-设置为bridged
2.eth0设置为hostonly
3.设置本地真实网卡允许eth0连接共享
4.在redhat中增加如下脚本,这样可实现hostonly模式和bridged的快速切换

当然你还可更改脚本让它智能判断当前网络处于什么情况自己切换。

[root@rh9bk root]# cat swnet.sh
if [ $# -eq 0 ];then
echo "Usage $0 hostonly|bridg"
exit 1
fi

case "$1" in
hostonly)
         ifconfig eth1 down
         ifconfig eth0 192.168.0.2 up
         route add default gw 192.168.0.1 #我的vmnet01网卡地址
        echo "ok! the network set hostonly..."
;;
bridg)
        ifconfig eth0 down
        ifconfig eth1 192.168.20.200 up
        route add default gw 192.168.20.1 #公司的网关地址
        echo "ok! the network set bridged.."
;;
esac
回复 支持 反对

使用道具 举报

发表于 2007-1-26 01:09:28 | 显示全部楼层

自己写给自己用的一个脚本,拿出来共享,有相同需要的兄弟请随便使用。

前几天装Dubuntu,默认/home是在装/分区,我手工将它挂在了/dev/hda10上,
当时在LiveCD下用root用户执行cp -R命令将/home下的文件复制到/dev/hda10上,
重启登入时报错,/home的权限设置不对,无法登入。
最后是用( cd /mnt/du/home; tar -cvf - . ) | ( cd /mnt/hda10; tar -xvf - )命令复制
在复制文件的同时,目录结构,修改时间,权限等也一并复制了,重启,登入成功。

这个命令比较长,而且空格较多容易输错命令
于是想减化一个输入,便想到了写一个脚本。同时以后要用到时也方便、安全些。
正好最近在学shell编程,也是一个练手的机会。
这是我写的第二个脚本,第一次写的是删除openoffice.org的脚本,格盘时不小心格了。

在使用该脚本时有两种模式可选择,
一种是命令模式,这是最早的写的。当时的脚本只有几行,只是把两个参数嵌入”cd“的后面,没有提示,没有路径与目录的检测。
另一种是向导模式,主要是给初次接触Linux的新手用的。
既然写了就要写好,于是加入了不同的使用模式,”是否为绝对路径“、”是否为目录“的检测,帮助与错误提示等。

如果各位兄弟觉得有用,欢迎使用、传播。
注:SUN_Knight就是本人,年龄在增长,ID也在不断更新中,呵呵。

#! /bin/bash

#脚本名称:Xcopy.sh
#脚本作者:SUN_Knight
#脚本功能:将源目录的目录结构、权限、修改时间等完整的复制到目标目录。
#脚本备注:写这个脚本的目的有三个
#         1.练习写脚本
#         2.以后装Dubuntu等系统时,将/home单独挂载到一个分区时方便复制
#         3.方便以后需要完整复制时可以偷懒,嘿嘿
#
#最后还要感谢LinuxSir上lastart兄和stoneman兄的帮助
#lastart和stoneman两位兄弟分别提供了两种不同的"是否为绝对路径"的判断方法
#因为修改现有代码方便,最终采用了lastart兄弟的方案,再次表示感谢。

case "$#" in

#向导模式
0) echo "将要复制目录结构"
   echo "请输入源目录绝对路径:"
   read s_dir
   echo "请输入目标目录绝对路径:"
   read d_dir
   while [ $# -eq 0 ]
   do
        if [ "${s_dir#/}" = "${s_dir}" ]
           then
             echo "错误的输入:"
             echo "    $s_dir不是绝对路径"
             if [ "${d_dir#/}" = "${d_dir}" ]
                then
                  echo "    $d_dir不是绝对路径"
                  echo "因为您错误的输入,程序将退出。"
                  echo "您可以检查正确的输入后重新运行本程序。"
                  break
             fi
             echo "因为您错误的输入,程序将退出。"
             echo "您可以检查正确的输入后重新运行本程序。"
             break
        else
             if [ "${d_dir#/}" = "${d_dir}" ]
                then
                  echo "错误的输入:"
                  echo "    $d_dir不是绝对路径"
                  echo "因为您错误的输入,程序将退出。"
                  echo "您可以检查正确的输入后重新运行本程序。"
                  break
             else
                  if [ -d $s_dir ]
                     then
                     if [ -d $d_dir ]
                        then
                             echo "请确认:"
                             echo "您将要把$s_dir目录完整复制到$d_dir目录中"
                             echo "yes/no?"
                             read yn
                             if [ $yn = "yes" ]
                                    then
                             ( cd $s_dir; tar -cvf - . ) | ( cd $d_dir; tar -xvf - )
                             break
                                 elif [ $yn = "no" ]
                             then
                               break
                          else
                               echo "您的输入:${yn}不正确"
                               continue
                             fi
                     else
                          echo "错误的输入:"
                          echo "    $d_dir不是目录"
                          echo "因为您错误的输入,程序将退出。"
                          echo "您可以检查正确的输入后重新运行本程序。"
                          break
                     fi
                else
                     echo "错误的输入:"
                     echo "    $s_dir不是目录"
                     if [ -d $d_dir ]
                        then
                          echo "因为您错误的输入,程序将退出。"
                          echo "您可以检查正确的输入后重新运行本程序。"
                          break
                     else
                          echo "    $d_dir不是目录"
                          echo "因为您错误的输入,程序将退出。"
                          echo "您可以检查正确的输入后重新运行本程序。"
                          break
                     fi
                fi
        fi
   fi
   done
   ;;

#命令模式
2) if [ "${s_dir#/}" = "${s_dir}" ]
      then
        echo "错误的输入:"
        echo "    $s_dir不是绝对路径"
        if [ "${d_dir#/}" = "${d_dir}" ]
           then
             echo "    $d_dir不是绝对路径"
             echo "因为您错误的输入,程序将退出。"
             echo "您可以检查正确的输入后重新运行本程序。"
        else
             echo "因为您错误的输入,程序将退出。"
             echo "您可以检查正确的输入后重新运行本程序。"
        fi
   else
        if [ "${d_dir#/}" = "${d_dir}" ]
           then
             echo "错误的输入:"
             echo "    $d_dir不是绝对路径"
             echo "因为您错误的输入,程序将退出。"
             echo "您可以检查正确的输入后重新运行本程序。"
        else
             if [ -d $1 ]
                then
                  if [ -d $2 ]
                     then
                       ( cd $1; tar -cvf - . ) | ( cd $2; tar -xvf - )
                  else
                       echo "错误的输入:"
                       echo "    $2不是目录"
                       echo "请您使用以下命令查看帮助:"
                       echo "Xcopy.sh help"
                  fi
             else
                  echo "错误的输入:"
                  echo "    $1不是目录"
                  if [ -d $2 ]
                     then
                       echo "请您使用以下命令查看帮助:"
                       echo "Xcopy.sh help"
                  else
                       echo "    $2不是目录"
                       echo "请您使用以下命令查看帮助:"
                       echo "Xcopy.sh help"
                  fi
             fi
        fi
   fi
   ;;

#帮助与错误提示
*) if [ $# -eq 1 ]
      then
        if [ $1 = "help" ]
           then
             echo "Xcopy.sh 帮助:"
           else
             echo "错误的参数!"
        fi
      else
        echo "错误!"
   fi
   echo "Xcopy.sh [[参数]|[源目录 目标目录]]"
   echo "Xcopy.sh                      向导模式"
   echo "Xcopy.sh help                 查看帮助"
   echo "Xcopy.sh 源目录 目标目录      命令模式"
   ;;
esac

如果哪位兄弟对上面的脚本有改进,请发一份给我,只有不断学习才能进步,谢谢。
我的邮箱是:superspecter007@yhaoo.com.cn
同时请您在修改、传播时保留致谢部分。
回复 支持 反对

使用道具 举报

发表于 2007-5-4 09:35:56 | 显示全部楼层
不错,很是不错。
回复 支持 反对

使用道具 举报

发表于 2007-6-28 16:05:28 | 显示全部楼层
我做了一套用在网络抓书的shell Script,比较多,可以在http://sourceforge.net/projects/zhuashushell

下载,可以抓10多个网站的在线书成txt格式方便离线阅读.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表