[原创]自己写的,拿出来分享,有需要的兄弟尽管用。

sh/bash/dash/ksh/zsh等Shell脚本
回复
superspecter007
帖子: 160
注册时间: 2007-01-10 22:31

[原创]自己写的,拿出来分享,有需要的兄弟尽管用。

#1

帖子 superspecter007 » 2007-01-26 1:23

[原创]自己写的,拿出来分享,有需要的兄弟尽管用。

前几天装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
#! /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
同时请您在修改、传播时保留致谢部分。
superspecter007
帖子: 160
注册时间: 2007-01-10 22:31

#2

帖子 superspecter007 » 2007-01-26 1:25

怎么代码的缩进都没了?
回复