【问题标题】:Bash while stops at first iteration [duplicate]Bash while 在第一次迭代时停止[重复]
【发布时间】: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
  • print0IFS 在我看来很可疑。试试print
  • 这适用于某些情况,但不知何故它仍然在中间停止(但进行更多迭代)
  • 如果您的文件中有空格,则需要部署一些技巧。 Examples.
  • @Barmar:这不是重复的。

标签: bash shell awk while-loop


【解决方案1】:

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

  1. 使用 xargs 在找到的每个项目上运行一个 shell 脚本,并且该脚本是唯一的参数
  2. 使用-exec 对每个项目运行shell 脚本。

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 2016-09-09
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2014-03-17
    • 2021-05-27
    相关资源
    最近更新 更多