持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 28 天,点击查看活动详情
第一次尝试写 shell 脚本,减少重复操作_番茄的笔记
start
- 背景:最近的工作中,遇到这么一个场景:需要频繁的下载文件,然后修改下载的文件名称。修改的名称是有规律的,这个场景会多次出现;
- 行动: 考虑到这种情况,是有规律的重复性劳动,随即就编写了一个
shell
脚本,用脚本代替我去修改文件名; - 结果:极大的提高了我工作的效率,之前需要 10 分钟的事情,现在仅需 1 分钟。
前置说明
- 由于下载地址会随机变化,所以此次编写脚本主要侧重于修改文件名的逻辑
需求与解决方案
1. hello world
按照国际惯例,开始学习一个语言的时候,先来一个 "hello world"。
主角: echo,用于输出内容,后面可以接需要输出的内容。
示例代码:
echo hello world
运行效果:
2. 拷贝文件
本次编写脚本的主要目的就是修改文件的名称,使用 mv
移动 和 cp
拷贝 这两个命令都可行,拷贝比较稳妥,所以我选择拷贝的方式。
示例代码:
cp ./tomato.txt ./lazy.txt
运行效果:
3. 注释
写代码嘛,肯定要写注释,避免后续时间太久遗忘了,所以这里说明一下,注释的方法#
。
# 下面的代码是一行正能量的代码。
echo 今天天气真不错!
4. 变量
在示例 2 中使用的是./
来指定文件目录,但是有时候我下载的文件存储的目录并不是固定的,所以直接./
并不友好,希望可以把这个路径独立抽离出来,方便后续改动。
示例代码:
lazy_tomato='偷懒的番茄'
echo lazy_tomato
运行效果:
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
运行效果:
命令解释
-
find ./ -name 'tomato-*.txt'
find
:寻找;./
:在那个文件目录;-name
:按名称匹配;'tomato-*.txt'
:星号是模糊匹配的意思。- 这一行代码执行下来的结果是
./tomato-hotfix202210-21.txt
,后面的语句就是用来去除前面的./
ps
如果没有匹配到。会返回空的内容。- 其次赋值给变量的时候需要 `` 包裹。
-
| sed 's#.*/##'
- 整体作用:输出文件名;
-
整体来说,逻辑就是在对应文件夹查找符合条件的问题名,再赋值给变量
6. 收集键盘输入的内容
有的时候希望脚本的部分配置是读取用户输入的内容,怎么办。
示例代码:
echo '请输入你想打印的内容'
read v_demo
echo $v_demo
运行效果:
完整代码
示例代码:
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'
运行效果:
如何
end
- 仔细想想,这个脚本算是我编写的第一个 shell 脚本了,虽然只是实现了很小的功能,但是对于我来说,很有意义很开心。棒!