正文
shell 如何避免误删目录
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 18.0px 'Helvetica Neue'; color: #3da742; -webkit-text-stroke: #3da742}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #139d5e; -webkit-text-stroke: #139d5e}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e; min-height: 18.0px}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p6 {margin: 0.0px 0.0px 8.0px 8.0px; text-align: justify; -webkit-hyphens: auto; text-indent: -8.0px; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e; background-color: #efefef}
span.s1 {font-kerning: none}
span.s2 {font-kerning: none; background-color: #efefef}
1、变量为空导致误删文件
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
(2)人肉判断变量是否为空:
[[ ${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
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #139d5e; -webkit-text-stroke: #139d5e}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e; background-color: #efefef}
span.s1 {font-kerning: none; background-color: #efefef}
span.s2 {font-kerning: none}
# bash a.sh
a.sh: line 4: a: unbound variable
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #139d5e; -webkit-text-stroke: #139d5e}
span.s1 {font-kerning: none}
span.s2 {font-kerning: none; background-color: #efefef}
那我们该如何防范这种问题呢?
(1)良好的编程习惯: 变量加引号防止扩展
path="/usr/local /sbin"
# rm -rf $path
rm -rf "$path"
(2)对变量进行语义检查
比如检测是否含有空格等特殊字符,不通用,不推荐这么做
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 18.0px 'Helvetica Neue'; color: #3da742; -webkit-text-stroke: #3da742}
span.s1 {font-kerning: none}
3、目录或文件含有特殊字符导致误删文件
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #139d5e; -webkit-text-stroke: #139d5e}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 18.0px 'Helvetica Neue'; color: #3da742; -webkit-text-stroke: #3da742}
p.p5 {margin: 0.0px 0.0px 8.0px 8.0px; text-align: justify; -webkit-hyphens: auto; text-indent: -8.0px; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e; background-color: #efefef}
span.s1 {font-kerning: none; background-color: #efefef}
span.s2 {font-kerning: none}
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
p.p1 {margin: 0.0px 0.0px 8.0px 8.0px; text-align: justify; -webkit-hyphens: auto; text-indent: -8.0px; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 14.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 18.0px 'Helvetica Neue'; color: #3da742; -webkit-text-stroke: #3da742}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e; min-height: 18.0px}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; -webkit-hyphens: auto; font: 16.0px 'Helvetica Neue'; color: #3e3e3e; -webkit-text-stroke: #3e3e3e}
span.s1 {font-kerning: none}
span.s2 {font-kerning: none; background-color: #efefef}
(2)检测 path 是否存在
[[ -d ~ ]] && echo 1
1
5、终极解决方案
不要使用 root 操作系统资源 ,这样至少不会删除系统文件。
6、在登录 shell 下使用友好的提示符
友好的命令提示符能时刻提醒操作者当前在哪个路径下,避免错误的路径下操作文件。