我是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 :)
有人可以帮我吗?
提前致谢。
答案 0 :(得分:3)
您正在修改PATH
变量,操作系统使用该变量定义查找实用程序的路径(这样您就可以调用它而无需键入二进制文件的完整路径)。系统在rm
当前指定的文件夹中找不到fuser
和PATH
(因为您用要删除的目录覆盖了它),因此它会输出错误。
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是一个特殊变量,用于控制系统查找命令可执行文件的位置(如rm
,fuser
等)。当您将其设置为/users/dinesh/di
时,它会在那里查找所有后续命令,并且(当然)找不到它们。解决方案:使用不同的变量名称。实际上,我建议在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