文档章节

Linux Shell 从入门到删除根目录跑路指南

大数据之路
 大数据之路
发布于 2016/11/24 21:22
字数 947
阅读 1.5W
收藏 207

shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭口之利器~

今天就来聊聊 linux 下一个常见的问题:如何避免误删目录。下文会详细的讲述不同的场景下误删目录,以及相应的解决方案。

1、变量为空导致误删文件

base_path=/usr/sbin
tmp_file=`cmd_invalid`
# rm -rf $base_path/$tmp_file

这种情况下如果 cmd 执行出错或者返回为空,后果将是灾难性的,那如何防范、避免呢?

(1)利用 shell 的变量扩展功能,如果变量为空赋给默认值或者抛出异常退出脚本

[root@script]# cat a.sh
a=`cmd`
echo ${a:?var is empty}/22
echo 1
[root@script]# bash a.sh
a.sh: line 1: cmd: command not found
a.sh: line 2: a: var is empty
[root@script]# 

(2)人肉判断变量是否为空

[[ ${tmp_file} == "" ]] && echo 1
1
[[ -z ${tmp_file} ]] && echo 1       
1

(3)如果变量未定义还可以开启 set 选项

# cat a.sh
# 若有用未设置的变量即让脚本退出执行
# set -o nounset
# 或
set -u
b=
echo $b
echo $a
echo 1

# bash a.sh

a.sh: line 4: a: unbound variable

# 另外,
# 如果命令运行失败让脚本退出执行
set -o errexit 
# 或
set -e

注意:为空未定义是两种不同的情况和处理方式,这类似 Java 中 String=“” 和 String=null 的区别

2、路径含有空格导致误删文件

史上最经典的要数下面这个bumblebee项目了,这个项目本来不出名,不过,程序在其安装脚本install.sh里的一个bug让这个项目一下子成了全世界最瞩目的项目。

那我们该如何防范这种问题呢?

(1)良好的编程习惯:变量加引号防止扩展

path="/usr/local /sbin"
# rm -rf $path
rm -rf "$path"

(2)对变量进行语义检查

比如检测是否含有空格等特殊字符,不通用,不推荐这么做

3、目录或文件含有特殊字符导致误删文件

ll
总用量 8
drwxrwxr-x 2 work work 4096 11月 24 18:57 '~'
-rw-rw-r-- 1 work work   34 11月 24 19:49 a.sh

# rm -rf ~

那我们该如何防范这种问题呢?

(1)良好的编程习惯:变量加引号防止扩展

rm -rf "~"

(2)如果不确定,删除之前 echo 或 find 一下,看变量被扩展成啥了

echo rm -rf "~"
rm -rf ~

echo rm -rf ~ 
rm -rf /home/work

4、cd 切换目录失败,导致文件被误删

cd ooxx_path_not_exsit
rm -rf *.exe

恭喜这种情况下你的当前目录下匹配文件都会被误删,那我们该如何防范这种问题呢?

(1)使用逻辑短路操作

cd path && rm -rf *.exe

(2)检测 path 是否存在

[[ -d ~ ]] && echo 1
1

5、终极解决方案

不要使用 root 操作系统资源,这样至少不会删除系统文件。

6、在登录 shell 下使用友好的提示符

友好的命令提示符能时刻提醒操作者当前在哪个路径下,避免错误的路径下操作文件。

OK,本文到此就结束了,列举了一些常见的case和解决方案,希望能对大家有所启发,如果有其他的 case 和建议也欢迎交流~

Refer:

[1] Bash 脚本 set 命令教程

http://www.ruanyifeng.com/blog/2017/11/bash-set.html

© 著作权归作者所有

大数据之路
粉丝 1624
博文 514
码字总数 330865
作品 0
武汉
架构师
私信 提问
加载中

评论(26)

傲风寒swk
傲风寒swk

引用来自“傲风寒swk”的评论

申请转载到微信公众号顶级程序员

引用来自“xrzs”的评论

随便转载无须同意,保留链接即可。
非常感谢~
大数据之路
大数据之路 博主

引用来自“傲风寒swk”的评论

申请转载到微信公众号顶级程序员
随便转载无须同意,保留链接即可。
傲风寒swk
傲风寒swk
申请转载到微信公众号顶级程序员
赵文君_123
挺有意思,懂你
aspboy
aspboy
学习了
逝水巟言
逝水巟言
还是没说怎么跑路~~
KisChang
KisChang
忍不住去Bumblebee仓库翻了翻,送上bug 的issue链接
https://github.com/MrMEEE/bumblebee-Old-and-abbandoned/issues/123
KisChang
KisChang
找时间再出一个《编程从入门到颈椎康复指南》,哈哈
苍松
苍松
一般做了这个的人不是跑路了,就是进局子里了😂
codebrother
codebrother
曾经未跑路,自动化脚本误删的东西,熬夜一晚上重写一遍。
不用虚拟机直接在线用的 Linux,统统都在这里! - 知乎

玩过 Linux 的同学,几乎都用过虚拟机!然而,你们肯定不晓得?不用装虚拟机,也有体验 Linux 的办法。下面一起来看看吧,到底如何不用虚拟机,照样能玩 Linux。 其实方法很简单,你只需要拥...

编程教室
2019/10/23
0
0
Linux 新用户的基本任务

如果您是 Windows 用户,那么您可能会发现您的新 Linux 系统与您常用系统有些不同。您的首要任务之一可能是安装其他软件,比如 IBM 面向 Linux 的众多软件中的一部分。在多数情况下,在 Linu...

IBMdW
2011/05/19
540
0
mongoDB 入门指南、示例

一、准备工作 1、 下载mongoDB 下载地址:http://www.mongodb.org/downloads 选择合适你的版本 相关文档:http://www.mongodb.org/display/DOCS/Tutorial 2、 安装mongoDB A、 不解压模式: ...

ibm_hoojo
2011/06/01
0
0
 好程序员大数据知识点精讲 大数据之Linux

好程序员大数据知识点精讲 大数据之Linux -Linux是什么? Linux是一套作业系统,不是应用程序Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。 Shell——命令行解...

好程序员IT
2019/06/17
15
0
在 Cloud 9 中搭建和运行 Go

简介 自从使用了Chromebook,我脑中一直充斥着在云端开发的念头。在我使用过的位数不多的在线开发环境中,唯有 Cloud 9令我比较满意。实际上,Cloud 9还不支持Go的开发,因此本文我将教大家如...

qingfeng哥
2013/11/29
6.9K
10

没有更多内容

加载失败,请刷新页面

加载更多

如何找到Python模块源的位置?

如何了解给定Python模块的源文件的安装位置? Windows和Linux上的方法是否不同? 我正在尝试特别寻找datetime模块的来源,但我也对更通用的答案感兴趣。 #1楼 我知道这个答案要晚4年了,但是...

技术盛宴
4分钟前
0
0
从Google的CDN下载jQuery UI CSS

我打算使用Google下载UI和Core的jQuery库。 我的问题是,他们允许我为此下载CSS还是应该自己托管它? 另外,如果我使用Google加载,应该如何加载其他插件? 我可以将所有插件压缩在一起吗,还...

javail
20分钟前
18
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
32分钟前
55
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
今天
47
0
每天AC系列(二):最接近的三数之和

1 题目 leetcode第16题,给定一个数组与一个目标数,找出数组中其中的三个数,这三个数的和要与目标数最接近。 2 暴力 按惯例先来一次O(n3)的暴力: int temp = nums[0]+nums[1]+nums[2];fo...

Blueeeeeee
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部