【问题标题】:Trying to my do my college exercise about recursion试着做我关于递归的大学练习
【发布时间】:2018-03-29 09:20:38
【问题描述】:

我的教授希望我们编写一个脚本来执行ls -l,将文件移动到另一个目录,如果有目录,它将进入该目录并再次调用自己。

#!/bin/bash
teste=/home/cunha/sistemas_operativos/versao3.sh

for i in ls -l "$1"; do
echo "$i"
    if [[ -d "$i" ]]; then #|!!!its making an infinite loop!!!|#
        bash "$teste" "$i"
    fi
done

我正在尝试做的事情:Ls -l 在输入目录上,显示每个文件,mv file dir,如果里面有另一个目录进入并调用自己做另一个ls -l

我现在的问题是它正在创建一个无限循环。

【问题讨论】:

  • 您的代码中有很多错误,请使用 shellcheck.net。 2 分:1. 使用 $(ls...) 来包装你的命令 2. 使用 ls 而不是 ls -l,bcoz ls -l 引入了额外的信息,而不仅仅是文件/目录名
  • 你的教授应该先学习更多关于 shell 编程的知识。
  • @chepner,我认为这个脚本不是教授写的,所以你怎么推断他的教授必须学习shell编程?脚本被清楚地复制了,因为它不能像它所写的那样工作(主要是通过ls -l 命令),但练习的答案很清楚......一切都在同一个目录中完成,所以调用递归永远.
  • 也许我草率地假设使用 ls -l 是文字说明的一部分,但遗憾的是,在太多的情况下,这种假设是成立的。

标签: linux bash shell loops for-loop


【解决方案1】:

您遇到的问题是您必须在启动新 shell 之前更改目录(使用cd),因为这是使您进入无限循环的原因,因为您正在递归分析 同一目录 再次。该脚本有很多错误,但您最好自己搜索它们而不是在 StackOverflow 中询问您的家庭作业的解决方案

因此,我不会发布正确的解决方案,尽管担心其他人会这样做。您必须独自完成作业,需要外部帮助并不难。使用man(1) 命令寻求帮助。

顺便说一句,标记为选定的答案也是不正确的,因为它不符合规范,它不是递归解决方案(正如您的老师要求的那样)并且与您的错误相同(但语法稍好) (别担心,因为我不值得这个答案的声誉:))

【讨论】:

  • 感谢您的诚实回答,在对脚本进行了很多修改后,我很好地理解了您的意思,并设法解决了它。它工作得很好,谢谢 :) 保持真棒
  • 很高兴看到您最终自己解决了问题 :)
【解决方案2】:

使用 R 选项,您将能够以递归方式获取文件列表。

#!/bin/bash
teste=/home/cunha/sistemas_operativos/versao3.sh

for i in `ls -lRt "$1"|grep ^-|awk -F" " '{print $9}'`; do
echo "$i"
    if [[ -d "$i" ]]; then #|!!!its making an infinite loop!!!|#
        bash "$teste" "$i"
    fi
done

【讨论】:

  • 你现在可以检查一下吗?我错过了一个报价。
  • 非常感谢 :) 你能解释一下 grep 在做什么和打印 $9 吗?
  • 没问题。grep 搜索模式并仅列出文件。 print $9 完成从输出中打印第 9 列的工作,即文件名或目录名。
  • 有人对for i in * 构造有疑问吗?
  • 向学生展示如此糟糕的技术是不可接受的!
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多