查看原文
其他

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

2017-11-26 xrzs CU技术社区
点击蓝色字关注"CU技术社区" 一起玩耍哦~

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


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


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


  1. base_path=/usr/sbin

  2. tmp_file=`cmd_invalid`

  3. # rm -rf $base_path/$tmp_file


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


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

  1. echo ${base_path:?var is empty}/${tmp_file:?var is empty}

  2. -bash: tmp_file: var is empty


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

  1. [[ ${tmp_file} == "" ]] && echo 1

  2. 1

  3. [[ -z ${tmp_file} ]] && echo 1      

  4. 1


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

  1. # cat a.sh

  2. # 若有用未设置的变量即让脚本退出执行

  3. # set -o nounset

  4. # 或

  5. set -u

  6. b=

  7. echo $b

  8. echo $a

  9. echo 1

  10. # bash a.sh

  11. a.sh: line 4: a: unbound variable

  12. # 另外,

  13. # 如果命令运行失败让脚本退出执行

  14. set -o errexit

  15. # 或

  16. set -e


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


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



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

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

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


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


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


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




  1. ll

  2. 总用量 8

  3. drwxrwxr-x 2 work work 4096 11月 24 18:57 '~'

  4. -rw-rw-r-- 1 work work   34 11月 24 19:49 a.sh

  5. # rm -rf ~


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

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

  1. rm -rf "~"


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

  1. echo rm -rf "~"rm -rf ~echo rm -rf ~

  2. rm -rf /home/work


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


  1. cd ooxx_path_not_exsit

  2. rm -rf *.exe


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

(1)使用逻辑短路操作


  1. cd path && rm -rf *.exe


(2)检测 path 是否存在

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


5、终极解决方案


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

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


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


OK,本文到此就结束了,列举了一些常见的 case 和解决方案。

什么如果你说跑路的解决方案?

不要在写字楼楼顶徘徊了。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存