乐趣区

关于java:完了良许直播中删库了……

大家好,我是良许。

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

常常来我直播间(视频号 + 抖音)的小伙伴都晓得,我最近始终都在直播间手把手现场写 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 教程网,满满都是干货!

退出移动版