处理 if 语句

处理 if 语句

我已经增强了代码问题我之前发过帖子:

我的代码是:

DIR="$1"


if [ -e "$DIR" ]

then

     echo -n "total directories:" ; find $DIR -type d | wc -l

     echo -n "total files:" ; find $DIR -type f | wc -l
else
if [ -f "$DIR" ]
then
    echo " Directory doesn't exist"

else
     echo  " please pass correct arguments"
fi
fi

./countfiledirs当我执行or时,此代码给出输出countfiledirs jhfsakl

sreekanth@sreekanth-VirtualBox:~$  ./countfiledirs 
 please pass correct arguments
sreekanth@sreekanth-VirtualBox:~$  ./countfiledirs ffff
 please pass correct arguments

当我执行脚本名称./countfiledirs时,我想要输出:

please pass correct arguments

对于./countfiledirs ffff如下:

directory doesn't exists

当我执行 script 时,代码还有另一个问题./countfiledirs /usr/share。它没有给出我给出的路径的实际目录和子目录数量。显示 4 个目录,而不是 3 个目录

答案1

如果存在则测试[ -f "$DIR" ]为真$DIR是一个文件。那根本不是你想要的。正如我在上一个问题中所建议的,您应该用来$#检查参数是否已通过。然后您可以使用-e来检查该参数是否存在。

下一期还将find列出.当前目录。您可以使用-mindepth 1GNU 来避免这种情况find

DIR="$1"

if [ $# -lt 1 ]
then
    echo "Please pass at least one argument" && exit   
fi
if [ -e "$DIR" ]
then
     echo -n "total directories:" ; find "$DIR" -mindepth 1 -type d | wc -l
     echo -n "total files:" ; find $DIR -type f | wc -l
else
      echo "Directory doesn't exist"
fi

您还可以将上述内容压缩为(尽管此版本不区分不存在的目录和文件而不是目录):

dir="$1"
[ $# -lt 1 ] && echo "Please pass at least one argument" && exit
[ -d "$dir" ] && printf "total directories: %s\ntotal files:%s\n" \
              $(find "$dir" -type d | wc -l) $(find "$dir" -type f | wc -l) ||
    printf "%s\n" "There is no directory named '$dir'."

答案2

正如您在最后一个条件中所看到的那样,您正在检查 $DIR 是否引用“常规文件”。也就是说,不是目录。所以它总是失败(因为你总是给出目录,大概)并打印“请传递正确的参数”。

至于目录计数“不正确”,事实并非如此。如果您像在脚本中一样手动运行 find 命令,您会看到它返回其搜索根目录及其子目录。因此,您可以知道它正在对给定目录进行计数,或者通过在调用 find 后简单地递减计数来获得您想要的答案。

这似乎就是您正在寻找的。请耐心听我说;我已经证实这有效,但我不是 BASH 专家。

DIR="$1"

if [ ! -d "$DIR" ]  #If not a directory, 
then
    echo " please pass correct arguments"
    exit 1
fi

# We know for sure $DIR is present and a directory, so we know
# that it will show up in the find results for type d. Decrement.
echo -n "total directories:" $(($(find $DIR -type d | wc -l) - 1))
echo
echo -n "total files:" ; find $DIR -type f | wc -l

相关内容