【发布时间】:2015-08-07 08:08:22
【问题描述】:
我目前是一个检查一些数据的 bash 脚本。到目前为止我得到的是:
!/bin/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 命令正在以某种方式发生冲突。工具makeconfigdefiniteley 总是返回0(无错误)。我尝试使用 sh -x script.sh 对其进行调试,但它没有显示任何我可以处理的内容。
有人可以在这里指出正确的方向吗?如果您需要任何进一步的信息,我可以给您。如果你想在这里测试 bash 脚本,我已经写了一个快速模仿程序(现在也是一个脚本,只是回显一些东西),只需通过 chmod +x 使其可执行:
echo "-t 3 -a 4"
echo "-t 6 -a 1"
echo "-t 9 -a 5"
只需将它与脚本放在一个文件夹中并创建一些子文件夹,这应该可以使它工作(尽可能多)。
提前致谢!
编辑:这不是前面提到的重复。这里的问题更多的是嵌套读取命令而不是print0(也许这也与它有关,但不完全)。
【问题讨论】:
-
使用
-print,而不是-print0。 -
print0和IFS在我看来很可疑。试试print。 -
这适用于某些情况,但不知何故它仍然在中间停止(但进行更多迭代)
-
如果您的文件中有空格,则需要部署一些技巧。 Examples.
-
@Barmar:这不是重复的。
标签: bash shell awk while-loop