使用shell脚本删除目录内容

时间:2012-05-29 06:39:39

标签: bash shell

我是Shell脚本的新手。我想删除用户HOME目录中的目录的所有内容,并删除一些与我的条件匹配的文件。用Google搜索了一段时间后,我创建了以下脚本。

#!/bin/bash
#!/sbin/fuser


PATH="$HOME/di"

echo "$PATH";

if [ -d $PATH ]
then
 rm -r $PATH/*
 fuser -kavf $PATH/.n*
 rm -rf $PATH/.store
 echo 'File deleted successfully :)'
fi

如果我运行脚本,我会收到如下错误,

/users/dinesh/di
dinesh: line 11: rm: command not found
dinesh: line 12: fuser: command not found
dinesh: line 13: rm: command not found
File deleted successfully :)

有人可以帮我吗?

提前致谢。

3 个答案:

答案 0 :(得分:3)

您正在修改PATH变量,操作系统使用该变量定义查找实用程序的路径(这样您就可以调用它而无需键入二进制文件的完整路径)。系统在rm当前指定的文件夹中找不到fuserPATH(因为您用要删除的目录覆盖了它),因此它会输出错误。

tl; dr请勿使用PATH作为您自己的变量名。

答案 1 :(得分:2)

这一行:

PATH="$HOME/di"

从PATH中删除所有标准目录(因此通常在rm/bin中找到的/usr/bin等命令'缺失')。你应该写:

PATH="$HOME/di:$PATH"

这保留了$ PATH中已有的内容,但将$HOME/di放在前面。这意味着如果您在该目录中有自定义命令,那么将调用它而不是/usr/bin或其中的标准命令。

如果您打算删除目录$HOME/di,那么您不应该使用$ PATH作为您的变量。你可以使用$path;变量名称区分大小写。或者您可以使用$dir或任何其他无数名称。您需要了解关键环境变量并避免破坏或滥用它们。在关键环境变量中,$PATH是最关键的一个($ HOME是另一个;实际上,在这两个之后,其余大部分都相对不那么重要)。通常,大写名称是为环境变量保留的;在脚本中使用小写名称作为局部变量。

答案 2 :(得分:2)

PATH是一个特殊变量,用于控制系统查找命令可执行文件的位置(如rmfuser等)。当您将其设置为/users/dinesh/di时,它会在那里查找所有后续命令,并且(当然)找不到它们。解决方案:使用不同的变量名称。实际上,我建议在shell脚本中使用小写变量 - 有许多大写的保留变量名,如果你尝试使用它们中的任何一个,你就会遇到麻烦。坚持使用小写是避免这种情况的简单方法。

BTW,一般情况下,最好在使用它们时将变量括在双引号中,以避免在更换它们之后对shell进行一些解析时出现问题。例如,使用[ -d "$path" ]代替[ -d $path ]$path/*有点复杂,因为*在引号内不起作用。解决方案:rm -r "$path"/*

随机其他注释:#!/sbin/fuser行没有做任何事情。只有脚本的第一行才能充当shebang。另外,不要费心将;放在shell脚本的行尾。

#!/bin/bash

path="$HOME/di"

echo "$path"

if [ -d "$path" ]
then
 rm -r "$path"/*
 fuser -kavf "$path"/.n*
 rm -rf "$path/.store"
 echo 'File deleted successfully :)'
fi