• Home
  • About
    • Road to Coding photo

      Road to Coding

      只要那一抹笑容尚存, 我便心无旁骛

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags

一个简单的shell脚本

13 May 2018

前言: 好久没写博客,而且shell也忘的差不多了, 今天下午刚好需要写个shell脚本,不如就来分析一下

内容需求如下:

  1. 完成指定内容的拷贝

  2. 判断源目录与目的目录的存在性

  3. 进行比对判断, 不要覆盖原有文件.

此脚本用到了以下几点:

  1. if-else-fi 的选择结构

  2. for的循环结构

  3. 函数

  4. 全局变量

  5. 命令引用

那么,话不多说, 直接看代码吧:

# !/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                                           # 调用函数

那么,通过这个例子,我们能学习到什么呢?

有以下几点:

  1. shell中若非使用local关键字, 声明的便全部都是全局变量, 有利有弊, 慎重抉择

  2. 函数一般是没有参数的, 调用时, 直接函数名即可, 切记, 不要干出写了函数不掉用的笑话

  3. shell中进行测试的时候, [] 两边各要留空, 切记不要忘了.

  4. 一般命令行参数不稳妥, 进入程序后便用变量进行保存

  5. 活用unset, set, 还是有必要的.

shell的内容就这么多, 建议是,有兴趣学完了之后, 没事写的时候在翻翻就行了,是真的容易忘

最后, 要不是劳资Ruby扔的时间更长, 我才不用这个有缺显的玩意…

这个sh能够完善的地方还是有很多的, 大家有兴趣了, 后面可以继续玩一玩(滑稽)

May 13, 2018 8:34 PM



ShellScript Share Tweet +1