【问题标题】:Execute function for every subfolder为每个子文件夹执行函数
【发布时间】:2022-01-25 08:18:19
【问题描述】:

我有一个名为 students_projects 的文件夹,其中包含 10 个子文件夹。每个子文件夹都有 project1.c 和 project2.c,每个都打印一个值。我制作了一个 bash 脚本函数来检查这些数字并将它们保存到一个 txt 文件中。我在桌面而不是文件夹中使用名为 project1 和 project2 的 2 个 .c 文件对其进行了测试。我确保我工作正常,但是当我为所有子文件夹运行它时,它一直保存桌面文件中的值。

我的功能:

function test () {
  gcc project1.c
  p1=$(./a.out)
  if (( $p1 == 20 ));
  then
    v1=30
  else
    v1=0
  fi
  gcc project2.c
  p2=$(./a.out)
  if (($p2 == 10 ));
  then
    v2=70
  else
    v2=0
  fi
  sum=$(( $v1 + $v2 ))
  on="cut -d' ' -f1 report.txt"
  onoma=$(eval "$on")
  temp="cut -d' ' -f2 report.txt"
  am=$(eval "$temp")
  printf "$onoma $am project1: $v1 project2: $v2 total_grade: $sum\n" >> grades.txt
}

那我做

for FILE in students_projects/* ; do
  test
done

【问题讨论】:

  • 您在函数外部使用的循环 (for FILE in students_projects/* ; do) 仅将变量 FILE 设置为与您的全局匹配的文件名 (students_projects/*);但是您似乎从未使用过该变量。我的猜测是你要么期望你的循环切换到目录(在这种情况下你缺少cd "${FILE}";,或者你想在你的函数中使用${FILE}作为大多数文件名的前缀(例如@987654328 @ 和其他人)。
  • 我还要补充一点,建议对诸如此类的脚本使用find 实用程序(尽管这不一定与这里的问题有关)。
  • 这里不需要使用cuteval。您可以使用 set -- $var 禁用 globbing (set -f) 或使用 read -ra array <<< "$var"
  • test 是 linux 上的现有命令,您不应该在函数中使用该名称。

标签: linux bash


【解决方案1】:

看起来grades.txt 文件位于顶层,但您想在每个目录下运行test。最简单的更改是将$PWD/grades.txt 的完整路径传递给函数。将它与运行“cd”结合到每个子目录中。建议:

for FILE in students_projects/* ; do
  (cd $FILE; test $PWD/grades.txt)
done

然后在您的“函数 test()”中,使用 $1 参数而不是 Grades.txt:

printf "..." >> $1

【讨论】:

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