大家好,我是良许。

今天跟大家聊个为难的事,大家能够本着看热闹不嫌事大的心态来听我唠唠。

经常来我直播间(视频号+抖音)的小伙伴都知道,我最近一向都在直播间手把手现场写 Shell 脚本。

就在前天晚上,我写 Shell 脚本的时分,不小心把当时目录下一切脚本(连同这个脚本本身)悉数删去了,并且还全程直播了……

这是我做直播到现在最大的一次直播事端啊。。

这个脚本的需求是这样的:把当时目录(包含子目录)下一切后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删去每个文件的第二行

我先把正确的脚本贴出来给各位看官看看:

#!/bin/bash 
ALL_SH_FILE=$(find . -type f -name "*.sh") 
for file in ${ALL_SH_FILE[*]} 
do 
# filename=${file%.sh*}
filename=$(echo $file | awk -F'.sh' '{print $1}') 
new_filename="${filename}.shell" 
mv "$file" "$new_filename" 
sed -i '2d' "$new_filename" 
done

这个需求看起来蛮多的,但仔细拆解一下,其实要求就下面这几个:

  1. 找到当时目录下一切以 .sh 结尾的文件;

  2. 遍历这些文件,将后缀改为 .shell

  3. 删去每个文件的第二行。

咱们在写代码的时分,必定不要着急动手,先拆解一下,这样写起来就简单很多。下面就逐个处理这些需求。

需求1:找到当时目录下一切以 .sh 结尾的文件

找文件,很简单就想到 find 指令。

find 指令结合的选项无非便是:-type-name-size-mtime ,其它的相对而言用得比较少。在这儿,很明显运用 -type-name

要是连 find 指令都用不熟的小伙伴,赶忙拍一拍文末的指令课。

$ find . -type f -name "*.sh"

需求2:遍历这些文件,将后缀改为 .shell

遍历文件问题也不大,便是运用 for xxx in yyy 这种格局,这儿的 yyy 便是咱们上面找到的悉数后缀 .sh 文件。

然后便是改后缀,肯定要运用到 mv 指令了。咱们一般是这样修正文件名的:

$ mv old_filename new_filename

这儿 old_filename 好办,便是咱们一个个遍历的文件名。关键是 new_filename ,怎样拼凑出咱们需求的文件名。

仔细分析一下,便是将 old_filename 里的 .sh 后缀去掉,再拼上 .shell 后缀。

去掉 .sh 后缀的方法有很多,这儿介绍两个:

  1. 字符串切片
$ filename=${file%.sh*}
  1. 运用 awk 指令切片

这儿用到一个很奇妙的方法,便是把 .sh 视为分隔符,然后提取的第一列便是文件名了。

$ filename=$(echo $file | awk -F'.sh' '{print $1}')

这样咱们就得到了没有 .sh 后缀的文件名了,咱们再拼上 .shell 后缀就行了。

$ new_filename="${filename}.shell"

然后,咱们再运用 mv 指令修正一下文件名就大功告成了。

需求3:删去每个文件的第二行

这个需求毫无难度,sed 一下就行了。所以说,文本处理三剑客在 Shell 脚本里真的是无处不在,大家必定要好好掌握。

$ sed -i '2d' "$new_filename"

三个需求都实现之后,咱们再写起代码来就没啥难度了。

直播中,为了演示便利,我创建了三个 .sh 后缀文件。

完了,良许直播中删库了……

然后,我一顿操作猛如虎,很快就写好了代码。

完了,良许直播中删库了……

当我雄心壮志敲下回车键运转脚本,打算在直播间秀一把时,得到了这样的成果:

完了,良许直播中删库了……

完了,怎样成果跟我预想的不一样?

完了,我的那几个 .sh 文件呢??

完了,我的脚本本身去哪了???

完了,难道我删库了??

完了,两个直播间加起来有 400 多号人正盯着我看呢。。

完了完了,翻车了,出丑了,为难了。。

你们看我我上面的操作记录就能够看到此时的我内心有多慌张。。

但我现已接连直播 5 个多月了,最高的时分有 3300+ 人在线,早现已身经百战,什么大风大浪没见过?

于是我迅速调整好心态,尽力回想是什么原因导致了这次翻车事端。

但是脚本现已没了,只剩下孤零零的一个 new_filename 这个文件,想复查代码都没方法。

我尽力回想,怎样也想不到究竟哪里出错了。

这个new_filename 也一向在那边,仿佛瞪着眼睛看着我,也在讪笑我。

今天在写这篇文章的时分,突然想到,一切的 .sh 文件都不见了,突然冒出了一个 new_filename 文件,或许能够从它下手。

再回看一眼代码,我恍然大悟!!

我特么在 mv 那里,new_filename 变量前忘记写了 $ 符号了!!然后就变成了这样:

$ mv "$file" "new_filename"

这下好了,一切的 .sh 文件悉数重命名成了 new_filename 了!

怪不得一切的 .sh 文件悉数离奇失踪。。

我再写一遍代码,然后手动把 new_filename 前面的 $ 去掉,成功复现了昨晚的现象。

终于是真相大白了……

所以啊,写代码必定要稳重再稳重,小心再小心,不然的话就有或许出现这种意想不到的成果。

实际上,之前在公司上班的时分,我有一次误操作,把我自己的代码悉数删去了。。还好有 Git ,不然我估量就要扫地出门了。。

Linux 下,不只 rm 指令很危险,mvcp 指令同样也没你想得那么本分,一不小心就或许把文件移没了或许覆盖了。

所以大家在运用这三个指令的时分,必定要一再承认之后再敲回车键,不然或许连哭都来不及了。

大家一同引以为戒。

PS :直播中有个小插曲。有个黑粉看到我出错了,开端各种挖苦嘲讽。好在直播间大家都比较友好,纷纷帮我怼回去。

写代码哪或许不会出错?你要是那么凶猛,也没空来我直播间看我写代码。程序员本来便是边写代码边调试的,能够一次成功的,估量没几个人能做到。

并且这种人,大概率在实际中也是唯唯诺诺,在领导面前阿谀奉承,薪资不过万之人。只有在网络上去喷他人,才能够找到一点存在感。

呵呵。


学习编程,千万不要急于求成,必定要多读一些经典书籍,多看源码,多下苦功夫去死磕代码,这样技术才能长进。给大家分享一些程序员必读经典书籍,必定要多读几遍:

完了,良许直播中删库了……

免费送给大家,只求大家金指给我点个赞!

程序员必读经典书单(高清PDF版)

有收成?希望老铁们来个三连击,给更多的人看到这篇文章

引荐阅读:

  • 干货 | 程序员进阶架构师必备资源免费送
  • 刷题 | LeetCode算法刷题神器,看完 BAT 随你挑!

欢迎重视我的博客:良许Linux教程网,满满都是干货!