前言: 好久没写博客,而且shell也忘的差不多了, 今天下午刚好需要写个shell脚本,不如就来分析一下
内容需求如下:
-
完成指定内容的拷贝
-
判断源目录与目的目录的存在性
-
进行比对判断, 不要覆盖原有文件.
此脚本用到了以下几点:
-
if-else-fi 的选择结构
-
for的循环结构
-
函数
-
全局变量
-
命令引用
那么,话不多说, 直接看代码吧:
# !/bin/bash
# -"- coding: utf-8 -"-
# @filename:copy.sh
# @date: 05/13/2018 17:47:46
# @author: Crow
# @description:
declare judge_res # 标识判断结果
declare dir_src=$1 # 用变量dir_src保存命令行参数
declare dir_dest=$2 # 用变量dir_dest保存命令行参数
# 判断目录是否存在的函数
function judge()
{
if [ -d $1 ] && [ -d $2 ]; then # 发起两个测试,同时判断两个目录是否存在
echo "Dir exist"
judge_res=1 # 标识目录存在
else
echo "Error, dir doesn't exist"
judge_res=-1
fi
}
declare file_src=`ls $1 | sort` # 读出指定目录内容并使用命令引用保存 $file_src
declare file_dest=`ls $2 | sort` # 读出指定目录内容并使用命令引用保存 $file_dest
declare record
function diff_copy()
{
cd $dir_src
for i in $file_src # 一重循环 src 文件
do
record=0
for j in $file_dest # 二重循环 dest 文件
do
if [ $i = $j ]; then
record=1 # 标识找到了
break 1 # 进入下一轮外层循环
else
continue 1 # 测试下一个 dest 文件
fi
done
if [ $record -eq 0 ]; then # 确定该目录下没有 src 文件
echo $i
cp $i $dir_dest # 进行文件拷贝
fi
done
}
function main()
{
judge
if [ $judge_res -eq 1 ]; then # 目录存在的情况下进行diff_copy()
diff_copy
fi
}
main # 调用函数
那么,通过这个例子,我们能学习到什么呢?
有以下几点:
-
shell中若非使用local关键字, 声明的便全部都是全局变量, 有利有弊, 慎重抉择
-
函数一般是没有参数的, 调用时, 直接函数名即可, 切记, 不要干出写了函数不掉用的笑话
-
shell中进行测试的时候, [] 两边各要留空, 切记不要忘了.
-
一般命令行参数不稳妥, 进入程序后便用变量进行保存
-
活用unset, set, 还是有必要的.
shell的内容就这么多, 建议是,有兴趣学完了之后, 没事写的时候在翻翻就行了,是真的容易忘
最后, 要不是劳资Ruby扔的时间更长, 我才不用这个有缺显的玩意…
这个sh能够完善的地方还是有很多的, 大家有兴趣了, 后面可以继续玩一玩(滑稽)
May 13, 2018 8:34 PM