第一次尝试写 shell 脚本,减少重复操作_番茄的笔记

118 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 28 天,点击查看活动详情

第一次尝试写 shell 脚本,减少重复操作_番茄的笔记

start

  • 背景:最近的工作中,遇到这么一个场景:需要频繁的下载文件,然后修改下载的文件名称。修改的名称是有规律的,这个场景会多次出现;
  • 行动: 考虑到这种情况,是有规律的重复性劳动,随即就编写了一个shell 脚本,用脚本代替我去修改文件名;
  • 结果:极大的提高了我工作的效率,之前需要 10 分钟的事情,现在仅需 1 分钟。

前置说明

  • 由于下载地址会随机变化,所以此次编写脚本主要侧重于修改文件名的逻辑

需求与解决方案

1. hello world

按照国际惯例,开始学习一个语言的时候,先来一个 "hello world"。

主角: echo,用于输出内容,后面可以接需要输出的内容。

示例代码:

echo hello world

运行效果: image.png

2. 拷贝文件

本次编写脚本的主要目的就是修改文件的名称,使用 mv 移动cp 拷贝 这两个命令都可行,拷贝比较稳妥,所以我选择拷贝的方式。

示例代码:

cp ./tomato.txt  ./lazy.txt

运行效果: image.png

3. 注释

写代码嘛,肯定要写注释,避免后续时间太久遗忘了,所以这里说明一下,注释的方法#

# 下面的代码是一行正能量的代码。
echo 今天天气真不错!

4. 变量

在示例 2 中使用的是./来指定文件目录,但是有时候我下载的文件存储的目录并不是固定的,所以直接./并不友好,希望可以把这个路径独立抽离出来,方便后续改动。

示例代码:

lazy_tomato='偷懒的番茄'
echo lazy_tomato

运行效果: image.png

5. 模糊匹配

同样是示例 2 ,有时候我想复制的文件名不是固定的。

例如:

tomato20221021.js
tomato20221020-hotfix.js
tomato20221019-xxx.js
tomato20221018-01.js
tomato20221018-02.js

这就涉及到对文件名称的模糊匹配,先看案例,再回头解释一下。

示例代码:

find ./  -name 'tomato-*.txt' | sed 's#.*/##'
# tomato-hotfix202210-21.txt

运行效果: image.png

命令解释

  • find ./ -name 'tomato-*.txt'

    1. find:寻找;
    2. ./:在那个文件目录;
    3. -name:按名称匹配;
    4. 'tomato-*.txt':星号是模糊匹配的意思。
    5. 这一行代码执行下来的结果是./tomato-hotfix202210-21.txt,后面的语句就是用来去除前面的 ./
    6. ps 如果没有匹配到。会返回空的内容。
    7. 其次赋值给变量的时候需要 `` 包裹。
  • | sed 's#.*/##'

    1. 整体作用:输出文件名;
  • 整体来说,逻辑就是在对应文件夹查找符合条件的问题名,再赋值给变量

6. 收集键盘输入的内容

有的时候希望脚本的部分配置是读取用户输入的内容,怎么办。

示例代码:

echo '请输入你想打印的内容'
read v_demo
echo $v_demo

运行效果: image.png

完整代码

示例代码:

echo hello world!!
echo 请输入您下载文件的路径:

# 接受用户输入
read v_link

# 定义一个变量,存储 名称为 app-*.js 文件的文件名
v_app_name=`find $v_link -name 'app-*.js' | sed 's#.*/##'`

# 开始拷贝
cp $v_link/app.js ./1.js
cp $v_link/$v_app_name ./2.js

echo '>>> Successful'

运行效果: image.png

如何

end

  • 仔细想想,这个脚本算是我编写的第一个 shell 脚本了,虽然只是实现了很小的功能,但是对于我来说,很有意义很开心。棒!