Проблема BASH с IFS во вложенном цикле чтения из MySQL - PullRequest
0 голосов
/ 08 января 2019

У меня проблема с моим 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 - 

Что вы заметите, что черточки ВСЕ в неправильном месте, но в поле "ПОЧЕМУ США" есть правильное место. В дополнение к этому мои вложенные циклы не запускались. Я полностью сбит с толку о «правильном» способе обработки пробелов в этих именах, и все же получаю желаемый вложенный вывод! Куда я иду не так?

РЕСУРСЫ

ТАК ВОПРОС Этот адрес обращается к IFS, пока вложен, но в неправильном контексте, непригоден для использования

ТАК ВОПРОС Опять та же проблема ... Очевидно, я попробовал то, что они имеют в разделе ответов, но безрезультатно.

...