【问题标题】:creating Unix script to check for directories and subdirectories in创建 Unix 脚本来检查目录和子目录
【发布时间】:2014-04-27 01:10:50
【问题描述】:

我正在使用 Korn shell 完成以下一项任务。

对于参数列表中的每个参数(成为当前路径名):

  1. 检查当前路径名是否为目录,如果是:
  2. 用 null(空)字符串初始化变量 maxsubdir,然后 一个 maxentries 变量为 0;
  3. 对于目录中的每个条目,检查该条目是否代表一个 目录,如果是,则查找该目录中的条目数 带有由ls -lwc 组成的管道的子目录,并保存 产生一个名为curentries的变量。
  4. 比较curentries和maxentries,如果curentries更大, 更新 maxsubdir 和 maxentries。 (--10 分)
  5. 当一个目录的for 循环完成时,显示(带有 echo) 目录名、maxsubdir 和 maxentries(带有适当的 解释性文字。)
  6. 如果 a) 中的路径名不是目录,则显示路径名 以及说明路径名不代表的说明文字 一个目录。
  7. 转到下一个命令行参数(路径名)并重复 1-7

脚本的执行在所有路径名都处理完毕后结束(while 已完成)

这是我目前拥有的代码(已编辑):

#!/bin/ksh

directoy=$1
while [ $# -ne 0 ]; do
    if [ -d $1 ]; then
        maxsubdir=
        maxentries=0
        for x in $1; do
            echo "Checking if $1 represents a directory..\n"
            curentries="ls -l | wc"
            if [ $curentries > $maxentries ]; then
                maxentries=$curentries
                maxsubdir=$curentries
            fi; 
        done
        echo "The directory structure of $1 is … \n"
        echo "Maximum sub directories: \n"
        echo "$maxsubdir\n"
        echo "Maximum directory entries: \n"
        echo "$maxentries"
    fi
done
  1. 我需要在哪里插入“shift”命令,因为我的 Unix 只能处理有限数量的参数?

  2. 我的语法合适吗?还是我在排序行上有语法错误?

  3. 脚本似乎在运行,但没有输出到屏幕?也许是无穷无尽的?

【问题讨论】:

  • if condition 中需要一个空格。 if [ $curentries > $maxentries ]
  • iamauser,ty,我添加了空格。仍然无法解决“第 6 行错误”投诉..
  • 获取变量值时使用 $varname。分配 $ 时去掉它
  • 请注意,您不要使用 directoy 变量。你有一个无限循环,因为你从不移动。但是您可能无论如何都不应该使用while 循环; for name in "$@" 将是一个更好的循环使用(从技术上讲,in "$@" 是可选的,但我个人总是写它是为了明确),尤其是因为你不必担心在哪里转移。
  • [ $foo > $bar ] 此处不正确。您正在寻找-gtman [: s1 s2 如果字符串 s1 基于其字符的 ASCII 值出现在 s2 之后,则为真。 n1 -eq n2 如果整数 n1 和 n2 在代数上相等,则为真。 n1 -gt n2 如果整数 n1 在代数上大于整数 n2,则为真。 n1 -ge n2 如果整数 n1 在代数上大于或等于整数 n2,则为真。 n1 -lt n2 如果整数 n1 在代数上小于整数 n2,则为真。

标签: linux shell unix ksh


【解决方案1】:

看看这里,看看这是否有帮助。解释在代码中。

#!/bin/ksh

    directory=$1

    # check whether the entered path is a directory
    if [ -d $1 ];then # yes, it's a directory
            maxsubdir=null
            maxentries=0
            echo "$1 is a directory"

            # you are only counting lines, add -l to wc
            # also you have to not count the first line. it's returns the size
            curentries=`ls -l $1 | wc -l`
            echo ${curentries}
    fi

【讨论】:

  • Alex,我这样做了,但仍然有“第 6 行错误”。具有讽刺意味的是,“then”现在位于第 5 行以及 IF-STATEMENT 的开头。
  • 在 [ 和你的语句和 ] 之间有空格吗?
  • 我添加了 if [ -d $1 ];然后到我的第 5 行。是的,我有空格。不知道为什么第一个错误不断发生。
  • 亚历克斯,谢谢。我根据你写的内容即兴创作了我的代码。我编辑了我最初的问题。
  • 请注意 null 不是空字符串(并且问题确实明确标识了“空(空)字符串”
【解决方案2】:
  1. 你没有。
  2. 您确实有一些错误。
  3. 或者,它永远不会到达那个代码?

您的作业专门说要使用for 循环,并且您已经实现了while 循环。

我会帮你开始的:

for directory in $*; do
  cd "$directory"
  curentries=$(ls -1 | wc -l)
  for entry in $(ls -1); do
    ...
  done
done

【讨论】:

  • 另外,“当前路径名”是一个有些模糊的术语,但如果您的教师使用它来表示“当前目录”,您会被告知每个目录都需要 cd
猜你喜欢
  • 1970-01-01
  • 2012-02-13
  • 2017-01-12
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2021-08-08
相关资源
最近更新 更多