首页 > 解决方案 > 从 MySQL 读取的嵌套 while 循环中的 IFS 的 BASH 问题

问题描述

我的bash脚本有问题——老实说,我认为这是完全理解 IFS 的问题。

我已经阅读了关于 SO 的多个问题,但我认为似乎是在绕圈子,因为没有一个专门解决与 MySQL 相关的问题……但我会听从你的专业知识。首先是我遇到问题的脚本:

#!/bin/bash

mysql --login-path=main-data -Nse "SELECT b.name, a.section_id
FROM some_table" | while read section_name section_id; do

echo "$section_name - $section_id"

    mysql --login-path=main-data -Nse "SELECT a.page_id, b.page_url
                FROM some_table" | while read page_id page_url; do
                echo "    - $page_url";
    done

 get_children() {
        mysql --login-path=main-data -Nse " SELECT b.sections_id, b.name
        FROM some_table" | while read child_id section_name; do
            echo "  -- $section_name";
            # If statement goes here -- Then recursive
            if [[ $child_id = *[!\ ]* ]]; then
            section_id=$child_id

            # Now get pages for child sections
            mysql --login-path=main-data -Nse "SELECT page_id, page_url
            FROM some_table" | while read page_id page_url; do
                echo "        - $page_url";
            done

            get_children $section_id
            fi

        done
    }

    get_children $section_id

done

如果我不IFS按原样运行脚本,则输出如下所示:

HOME - 732
    - Home.htm
    - Home2.htm
    - Nome3.htm
WHY - US        742
ROOFING - 743
    - Residential-Roofing.htm
  -- Certainteed
        - CertOverview.htm

问题来自“为什么我们”——如果你注意到破折号出现在错误的位置——显然是一个分隔符问题,因为那里有一个空格..现在如果我将第一个循环更改为:

mysql --login-path=main-data -Nse "SELECT a.page_id, b.page_url
FROM some_table" | while IFS='\n' read page_id page_url; do

我的输出变为:

HOME    732 - 
WHY US  742 - 
ROOFING 743 - 

您会注意到破折号都在错误的位置,但是“为什么我们”中有正确的空格。 除此之外,我的嵌套循环没有运行。我对处理这些名称中的空格的“正确”方法感到非常困惑,并且仍然获得所需的嵌套输出!我哪里错了?

资源

SO QUESTION 这个在嵌套时解决了 IFS,但在错误的上下文中,无法使用

所以问题 再次同样的问题......显然我尝试了他们在答案部分的内容无济于事。

标签: bashnested-loopsdelimiterdo-whileifs

解决方案


推荐阅读