У меня проблема с моим 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, пока вложен, но в неправильном контексте, непригоден для использования
ТАК ВОПРОС
Опять та же проблема ... Очевидно, я попробовал то, что они имеют в разделе ответов, но безрезультатно.