我试图使用for循环迭代目录中的所有文件:
程序并非尝试迭代
#!/bin/bash
myname="bandit24"
cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
for file in /var/spool/bandit24/*; # <----- here
do
if [ "$file" != "." -a "$file" != ".." ];
then
echo "Handling $file"
owner="$(stat --format "%U" ./$file)"
if [ "${owner}" = "bandit24" ]; then
timeout -s 9 60 ./$file
fi
rm -f ./$file
fi
done
但是结果却是我得到以下内容:
Executing and deleting all scripts in /var/spool/bandit24:
Handling /var/spool/bandit24/*
stat: cannot stat './/var/spool/bandit24/*': No such file or directory
程序并非尝试迭代
/var/spool/bandit24/
目录中的文件,而是尝试迭代 /var/spool/bandit24/*
文件本身。但我想迭代 /var/spool/bandit24/
目录中的文件。如何操作?
附加问题:
cd /var/spool/$myname
是什么意思(第5行)?据我理解,它用于指定我们要操作的目录,对吗?
do
放在新行上,则无需在带有for
的行末添加;
。至于您的附加问题:是的。 - Ljm Dullaart/var/spool/bandit24
为空的结果。在这种情况下,/var/spool/bandit24/*
扩展为它本身。如果你希望它扩展为空,你可以在 for 循环之前启用nullglob
bash 选项:shopt -s nullglob
。 - Renaud Pacaletstat
。在for循环中的(未指定的)命令会产生它。如果你在那里放置rm -f "$file"
,它就不会产生错误消息。其次,stat
找不到.//var.spool/bandit24/*
。./
使得这不太可能来自这个脚本。 - Ljm Dullaart.//var/
是一个打字错误。 - Renaud Pacaletfor file in /var/spool/bandit24/*
,如果目录不为空,变量file
将会取值如/var/spool/bandit24/foobar
,而不仅仅是foobar
。因此,你不能将其与./$file
一起使用。解决方案:当你在/var/spool/bandit24
目录中使用cd
命令时,只需编写for file in *
即可。 - Renaud Pacalet