我正在编写一个 shell 脚本,该脚本应该接受一个参数(目录名称)并显示该目录中有多少个文件、目录、可读文件、可写文件和可执行文件。如果运行时未给出参数,则应该显示错误消息并中止。如果给定的参数不存在,它还应该显示错误消息并中止。否则它应该显示上述信息。我一辈子都无法让它运行。这是我所拥有的,请帮忙!:
#!/bin/csh
$1
set file=$1
if ($file==0)then
echo "usage: assignment6.sh <directory_name>"
exit0
else
if (-e $file && -r $file) then
echo "Number of Directories: `ls | wc -w`"
echo "Number of Files: `ls -d */ | wc -w`"
echo "Number of Readable files: `find * -type f -or -type d -maxdepth 0 -perm +u=r | wc -w`"
echo "Number of Writable files: `find * -type f -or -type d -maxdepth 0 -perm +u=w | wc -w`"
echo "Number of Executable files: `find * -type f -or -type d -maxdepth 0 -perm +u=x | wc -w`"
else
if (! -e $file) echo "No such directory."
exit 0
endif
endif
exit 0
答案1
该脚本中的问题:
- 您正在解析 的输出
ls
。 不解析ls
。 - 您依赖于文件名不包含空格或换行符。 它们可以包含其中任何一个。
- 你正在使用
csh
.一切都靠它自己,这对于 shell 脚本来说是个坏主意。 Bash、Ksh、Zsh,几乎任何事物但这csh
是一个更好的主意。 (我的观点,但请仔细阅读链接的事实推理。)
这是该程序部分的 POSIX 兼容版本。 (如果以后有时间,我可能会包括其余的功能。)
这不会处理文件数量超过参数列表的情况,但可以修改它来执行以下操作:真的必要的。
#!/bin/sh
[ "$#" -eq 1 ] && [ -d "$1" ] || {
printf 'Usage:\t%s <directory>\n' "$0"
exit 1
}
dirs="$(find "$1" -path '*/*/*' -prune -o -type d -exec sh -c 'printf %s\\n "$#"' sh {} +)"
files="$(find "$1" -path '*/*/*' -prune -o -type f -exec sh -c 'printf %s\\n "$#"' sh {} +)"
printf 'Number of directories in %s:\t%s\n' "$1" "$dirs"
printf 'Number of files in %s:\t%s\n' "$1" "$files"
由于-maxdepth
主设备不可移植,因此我使用了此处描述的技术: