1

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

#!/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 :)

有人可以帮我吗?

提前致谢。

4

3 回答 3

3

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

tl;dr 不要PATH用作您自己的变量名。

于 2012-05-29T06:55:11.383 回答
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 是另一个;实际上,在这两个之后,其余的大部分相对不太重要)。按照惯例,大写名称是为环境变量保留的;对脚本中的局部变量使用小写名称。

于 2012-05-29T06:54:56.520 回答
2

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

顺便说一句,通常最好在使用它们时将变量括在双引号中,以避免在替换它们后对 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
于 2012-05-29T07:01:09.103 回答