Shell 开发经验总结(中)

2021-06-22 14:29:46 浏览数 (1)

三.易错类shell

这里介绍的主要是日常shell编写中遇到比较隐蔽或看似简单,却难以发现的“坑”,编写中应尽量避免使用,使用更优的方法避免重蹈覆辙。

1)更新文件使用>不用cp 使用>修改和回退文件时,保留原文件的属组和权限,避免使用cp时权限属组被修改。

2)使用kill前确认 关键字用-w 精确匹配字段; kill前后都保留现场, 两次ps -ef|grep -w 关键字|grep -v grep >>/tmp/kill_进程名_.backup; 删除前要校验,获取进程号是否唯一,避免多杀或误杀的情况。

3)使用rm前确认 删除前备份删除对象信息,避免使用变量,直接使用文件和目录名; 如果必须使用时,删除前,建议检查避免误删,删除目录和文件信息保留:

建议禁用find遍历根目录进行查找,同时删除前进行确认,避免多删或误删的情况。

4)For循环的坑 for循环的in条件按空格来区分,避免进入不正确或死循环。

5)while循环的禁忌 如果还想使用循环中的变量,不要while结合管道使用。

6)慎用cp 这句话基本上正确,但同样有空格分词的问题。所以应当用双引号:

但是如果凑巧文件名以 - 开头,这个文件名会被 cp 当作命令行选项来处理。 可以试试下面这个:

但也可能再碰上一个不支持 – 选项的系统,所以最好用下面的方法:

7)慎用cd 避免使用cd到操作目录再操作的方式,可能导致进入目录失败,误删除,如:

建议如下:

8) 用[[ ]]代替[ ]

当$var为空时,上面的命令就变成了[ =”bar” ]

类似地,当$var包含空格时: [ space words here = “var” ]两者都会出错。所以应当用双引号将变量括起来: [ “$var” = var ] 几乎完美了。

但是,当$var以 - 开头时依然会有问题。在较新的bash中你可以用下面的方法来代替,[[ ]]关键字能正确处理空白、空格、带横线等问题。

另注意,[[适用于字符串,如果是数值,要用如:(( $var > 8 ))

9)管道操作中不要同时读写文件

你不能在同一条管道操作中同时读写一个文件。根据管道的实现方式,file要么被截断成0字节,要么会无限增长直到填满整个硬盘。如果想改变原文件的内容,只能先将输出写到临时文件中再用mv命令。

10)cd的易错问题 cd 有可能会出错,导致要执行的命令就会在你预想不到的目录里执行了。所以一定要记得判断cd的返回值。

如果你要根据cd的返回值执行多条命令,可以用 ||。

关于目录的一点题外话,假设你要在shell程序中频繁变换工作目录,如下面的代码:

不如这样写:

括号会强制启动一个子shell,这样在这个子shell中改变工作目录不会影响父shell(执行这个脚本的shell),就可以省掉cd - 的麻烦。

0 人点赞