使用Shell脚本自定义命令


前言

无论是在搭建自己的个人博客过程中还是平时的工作生活中,都会有文件备份的习惯,有些文件往往比较重要,需要经常性的打包备份一次。就我在搭建Hexo博客而言,每次都要清理public文件夹后将文件进行打包备份,移动到其他文件夹或者网盘存储。每次重复性的,周期性的操作认为比较繁琐,因此想使用一个简单的脚本将重复繁琐的备份任务用一个命令解决。

开始吧~

什么是shell

shell简单的说就是我们使用的命令解释器,你打开的终端就是shell。你部署hexo博客就是用的Git bash,其中bash属于shell中的一种。

什么是shell脚本

我们打开终端(shell)敲下一行行命令,是只能一条一条的发送命令。我所理解的shell脚本就是,可以将bash中一条一条敲下的命令组合到一起,命令之间可以相互联系,最终依次全部执行的文件。而且这类文件是一类带有.sh拓展名的文件。

  • shell脚本如何编写?

使用vi/vim编辑器、VS codeNotepad++等其他编辑器,以shell scripts的格式保存即可编写.sh文件。

使用bash中执行的命令都可以在shell脚本中执行。

如需要深入了解shell脚本可参考:shell教程

  • shell脚本如何运行?
    • 可双击.sh文件直接运行
    • 在脚本文件目录下运行sh xx.sh
    • 添加环境变量PATH,使你的脚本变成一个命令。

制作打包备份博客源代码的shell脚本

开始制作脚本之前,需要了解一下,在打包过程中,需要用到自己安装的压缩软件的打包命令。

我使用的是Bandizip软件,官网提供了软件相关的命令行代码,Bandizip命令行参数。其他软件可自行百度。此教程使用Bandizip示例。

Bandizip命令行参数

使用vivimVS code等编辑器创建新文本,使用简单的命令组合制作脚本:

#!/bin/sh
# 用于打包备份blog文件
cd /c/Users/Sumsung524/Sumsung524.github.io # 定位到需要清理的位置
echo "已定位到目标文件夹"
hexo clean # 清理文件
echo "清理完成"
cd /c/Users/Sumsung524 # 定位到需要打包的位置
echo "已定位到打包位置"
bandizip.exe c -y $(date -d "today" +"%Y.%m.%d").zip Sumsung524.github.io
# 将Sumsung524.github.io文件夹打包,并以当天打包时间命名。
# c表示打包文件,-y表示:所有询问都为是若无错误发生,则在任务完成时关闭(解)压缩窗口
echo "打包完成"
mv $(date -d "today" +"%Y.%m.%d").zip /C/Users/Sumsung/OneDrive/MyBlog/Backup.zip
# 将生成的打包文件移动到备份文件夹中
echo "移动成功"
cd /c/Users/Sumsung524/Sumsung524.github.io 
hexo generate # 回到原来的位置重新解析文件
echo "重新解析成功"

做好之后以.sh拓展名保存到一个位置(你也可以直接不带任何拓展名,同样可以直接运行命令,甚至更加方便)。其中#!/bin/sh代表是一个shell脚本文件(这个没有关系不大),#用于注释,echo表示输出内容,可以不用。$(date -d "today" +"%Y.%m.%d").zip表示打包当天的日期。

如果你认为代码太复杂可以简化为:

#!/bin/sh
cd /c/Users/Sumsung524/Sumsung524.github.io
hexo clean
cd /c/Users/Sumsung524
bandizip.exe c -y $(date -d "today" +"%Y.%m.%d").zip Sumsung524.github.io
mv $(date -d "today" +"%Y.%m.%d").zip /C/Users/Sumsung/OneDrive/MyBlog/Backup.zip
cd /c/Users/Sumsung524/Sumsung524.github.io 
hexo generate

如果你需要在打包的时候需要对文件加上其他命名,可加入如下代码:

echo "输入文件名"
read file_name
bandizip.exe c -y $(date -d "today" +"%Y.%m.%d")"${file_name}".zip Sumsung524.github.io
mv *.zip /C/Users/Sumsung/OneDrive/MyBlog/Backup.zip

在这里添加了一个叫file_name(名称自取)的变量,访问变量时,需要在变量名称之前添加“$”,如“$ {变量}”,将变量用“{}”括起来。

$(date -d "today" +"%Y.%m.%d").zip改为*.zip。会将所在目录下的所有zip格式移动到目标目录。

这样做好之后,运行脚本的时候就需要你设置文件名:

要求输入文件名

当然如果不想加文件名的时候可以选择直接回车。效果和之前脚本一样。

添加PATH

做好脚本之后,测试一两次没有问题之后,我们将脚本保存到一个文件夹中,以便日后再用。但以后每次使用都要到脚本文件目录下执行脚本,要在前面输入很长一段的路径,很不方便。因此我们要找一个linux命令行在任意目录下启动任意的脚本的方法,就是给他添加一个PATH。

简单说PATH就是一组路径的字符串变量,当你输入的命令不带任何路径时,LINUX会在PATH记录的路径中查找该命令。

  • PATH的作用就是每次在Bash里面输入一个命令时, Bash都会去PATH列表里面去找对应的文件,找到了就执行, 脚本其实就是一个可执行的文件(ls, cd, mkdir..)
  • 可以输入命令echo $PATH查看所有的路径,Bash就会在这些路径中依次查找
  • 临时设置PATH
pwd #查看下脚本所在的绝对路径
export PATH="脚本的绝对路径:$PATH" # 这句话就是将脚本所在的目录加到PATH里

上面的PATH在重启Bash后就会失效。

  • 永久设置PATH
touch ~/.bashrc # 创建~/.bashrc
vi ~/.bashrc # 编辑~/.bashrc
在编辑器里写入 export PATH="local的绝对路径:$PATH"
source ~/.bashrc # 保存编辑,这句命令一定要写
zip # zip是我的脚本文件名,直接输入你的文件名即可直接运行脚本。

注意:

整个备份脚本文件已经做完了,以后可以轻松的使用一个自己自定义的命令(修改脚本文件名)即可完成文件备份了!在使用过程中有几个需要注意的点:

  1. 不要去改动备份目标文件夹路径中文件夹的名称,或者改动之后相应的脚本位置也需要统一改动。
  2. 打包目录下不能存放其他zip格式的文件,否则会全部移动到目标路径文件夹下。
  3. 可以将备份文件的目标路径设置为网盘的备份文件夹(OneDrive、百度网盘、天翼云等),从而实现双备份。

个人使用的是Onedrive网盘同步盘,将目标文件夹下备份打包好的文件,等网盘同步之后,使用释放空间功能,将打包的文件上传到网盘而不保留到本地,既释放了空间,也实现的文件的备份。目标文件夹只相当于一个临时存储区。

Onedrive释放本地空间存储文件至云端

另外,如需系统学习shell脚本请下载:Linux命令行与shell脚本编程大全.第3版

其他实例

上传Github做笔记备份

目的:新建命令gitbackup一键备份笔记,并根据日期提交git commit

操作:
新建文件gitbackup,VScode编辑命令,保存:

#!/bin/sh

# 定位到笔记文件路径下

cd ~/matery/source/_posts

git add *
# 提交备注日期时间

git commit -m "$(date -d "today" +"%Y.%m.%d")"

# 查看上传内容

git status

git push origin master

简化上传博客命令

自己的博客需要上传至腾讯托管和GitHub仓库
正常情况下需要清空、压缩、上传github、上传腾讯云

hexo cl && gulp && hexo d && tcb hosting deploy ~/matery/public -e sumsung-107420 && hexo cl

命令太长,想设置一个命令uploadblog代替上一段命令

新建uploadblog 文件,写入命令并保存:

#!/bin/sh

# 定位路径
cd ~/matery/
# 清理
hexo clean
# 压缩代码
gulp
# 上传github
hexo d
# 上传腾讯云托管
tcb hosting deploy ~/matery/public -e sumsung-107420
# 清理
hexo cl

评论
 上一篇
为你的Hexo博客添加新页面 为你的Hexo博客添加新页面
为你的Hexo博客添加新页面前言 由于自己收藏了很多各式各样的网站,很多都很有价值,一直都在存在浏览器书签中,由于书签网站比较多,东西比较杂乱。需要整理,正好想将自己的网站整理出来放到自己的Blog上。于是想做一个书签网站分享页。 今天来
2020-07-13
下一篇 
新建文章自动打开本地Markdown编辑器 新建文章自动打开本地Markdown编辑器
新建文章自动打开本地Markdown编辑器使用Hexo写新文章时,需要控制台执行 hexo new "文章名字",这样就会在_posts 下生成一篇新文章,但需要手动打开,挺麻烦的。 只需要在站点根目录下新建 scrip
2020-07-12
  目录