Bash在第一次迭代时停止

时间:2015-05-25 19:54:52

标签: bash shell awk while-loop

我目前是一个应该检查一些数据的bash脚本。到目前为止我得到的是:

!/斌/庆典

#!/bin/bash

find "./" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d '' file; do
    folder=${file##*/}
    echo "Checking ${folder} for sanity..."
    ./makeconfig ${folder} | while read -r line; do
        title=`echo $line | awk -F' ' '{print $2}'`
        echo $title
    done
done

现在它的作用是:搜索./中的每个目录并提取文件夹名称(因此:从./的结果中删除find)。然后把它交给一个自编的工具,输出一些这样的行:

-t 1 -a 2
-t 3 -a 5
-t 7 -a 7
-t 9 -a 8

我通过awk收集-t后面的值。到目前为止这也有效,问题是,外部while循环在第一次迭代后停止,因此只检查一个文件夹。我的猜测是内环和外环的两个read命令以某种方式发生碰撞。工具makeconfig definitiveley始终返回0(无错误)。我尝试使用sh -x script.sh调试它,但它没有向我显示任何我可以处理的内容。

有人能指出我在哪里出错了吗?如果您需要任何进一步的信息,我可以给他们。如果你想在这里测试bash脚本(现在也是一个脚本,只是回应一些东西),我写了一个快速的模仿程序,只需通过chmod +x使其可执行:

echo "-t 3 -a 4"
echo "-t 6 -a 1"
echo "-t 9 -a 5"

只需将脚本放在一个文件夹中并创建一些子文件夹,就可以使其工作(尽可能多)。

提前致谢!

编辑:如上所述,这不是重复。这里的问题是嵌套的读命令比print0更多(也许这也与它有关,但并不完全)。

1 个答案:

答案 0 :(得分:0)

IFS=未将字段分隔符设置为空字符串(\0),但未完全取消设置,因此立即读取find命令的整个输出。如果你在没有-print0参数的情况下运行find,那么在bash中使用它会更容易。另外两种选择:

  1. 使用xargs在找到的唯一参数
  2. 的每个项目上运行shell脚本
  3. 使用-exec在每个项目上运行shell脚本。