来自:xrzs的博客
链接:https://my.oschina.net/leejun2005/blog/793916
(点击尾部阅读原文前往)
程序猿自媒体已获转载授权
shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭口之利器~
今天就来聊聊 linux 下一个常见的问题:如何避免误删目录。下文会详细的讲述不同的场景下误删目录,以及相应的解决方案。
base_path=/usr/sbin
tmp_file=`cmd_invalid`
# rm -rf $base_path/$tmp_file
这种情况下如果 cmd 执行出错或者返回为空,后果将是灾难性的,那如何防范呢?
(1)利用 shell 的变量扩展功能,
如果变量为空赋给默认值或者抛出异常退出脚本:
echo ${base_path:?var is empty}/${tmp_file:?var is empty}
-bash: tmp_file: var is empty
[[ ${tmp_file} == "" ]] && echo 1
1[[ -z ${tmp_file} ]] && echo 1
1
(3)如果变量未定义还可以
开启 set 选项
:
# cat a.sh
set -u
b=
echo $b
echo $a
echo 1
# bash a.sh
a.sh: line 4: a: unbound variable
史上最经典的要数下面这个bumblebee项目了,这个项目本来不出名,不过,程序在其安装脚本install.sh里的一个bug让这个项目一下子成了全世界最瞩目的项目。
path="/usr/local /sbin"
# rm -rf $path
rm -rf "$path"
(2)对变量进行语义检查
比如检测是否含有空格等特殊字符,不通用,不推荐这么做
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 ~
(2)如果不确定,
删除之前 echo
或 find 一下,看变量被扩展成啥了
echo rm -rf "~"
rm -rf ~
echo rm -rf ~
rm -rf /home/work
cd ooxx_path_not_exsit
rm -rf *.exe
恭喜这种情况下你的当前目录下匹配文件都会被误删,那我们该如何防范这种问题呢?
不要使用 root 操作系统资源
,这样至少不会删除系统文件。