【问题标题】:Recursion in bash: code after recursion not executedbash中的递归:递归后的代码未执行
【发布时间】:2023-01-20 17:16:48
【问题描述】:

我有一个简单的问题,我想用 bash 脚本解决:复制一个文件,然后复制在该文件中导入的所有文件,以及在该文件中导入的所有文件,等等。 这尖叫递归。

这些文件如下所示:

import "/path/to/otherfile.txt"
import "/path/to/anotherfile.txt"

information
otherinformation
...

不应该这么难,这是我写的:

#!/bin/bash

destination=/tmp

copy_imports () {
  insfile=$1
  contained_imports=$(grep "import" $insfile | awk -F' ' '{ print $2 }' | sed 's/"//g')
  for imported_insfile in $contained_imports
  do
    copy_imports $imported_insfile
  done

  cp $insfile $destination
}


copy_imports $1

但由于某种原因,并非所有文件都被复制。我看到它正在为所有文件和嵌套导入调用递归,但不是所有文件都执行 cp 语句。

我完全不解,这是怎么回事?

非常感谢!

【问题讨论】:

标签: bash recursion


【解决方案1】:

看起来您的脚本正在尝试递归复制所有导入的文件及其导入。但是,似乎没有对所有导入的文件执行 cp 语句的问题。

一个可能的原因是某些导入的文件可能不在当前目录中,或者它们可能没有正确的复制权限。要检查导入的文件是否存在于当前目录中,可以使用 ls 命令列出当前目录中的所有文件并查看导入的文件是否存在。

另一个问题可能是contained_imports变量可能为空,这会导致for循环不执行,导入的文件不会执行cp语句。可以在for循环前添加检查变量是否为空,确保cp语句一直执行。

#!/bin/bash

destination=/tmp

copy_imports () {
  insfile=$1
  contained_imports=$(grep "import" $insfile | awk -F' ' '{ print $2 }' | sed 's/"//g')
  if [ -z "$contained_imports" ]; then
    cp $insfile $destination
    return
  fi
  for imported_insfile in $contained_imports
  do
    copy_imports $imported_insfile
  done

  cp $insfile $destination
}


copy_imports $1

在尝试使用 [ 命令或测试命令的 -f 或 -e 选项复制文件之前,添加检查文件是否存在也是一个好习惯。

if [ -e "$insfile" ]; then
  cp $insfile $destination
fi

还值得注意的是,如果导入的文件具有相对路径,则脚本将无法按预期工作,因为当前工作目录可能会在递归期间发生变化。在这种情况下,为导入的文件使用绝对路径可能是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多