Bash - проблема с разбиением строки из разбора mysql-client в Ubuntu 18 - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть сценарий, который обращается к центральному серверу базы данных (mariadb 10.2 в CentOS 7.7), чтобы получить случайную запись в базе данных.

#!/bin/bash

function getrandom()
{
     mysql -h 11.22.33.44 -P 3306 -u usr -p password -D dbExample -e "SELECT ip, host FROM hosts ORDER BY RAND() LIMIT 1;"
}

entry=$(getrandom)

База данных содержит записи, т.е. 1006 * Итак, mysql select должен получить следующую строку:

ip host 8.8.8.8 facebook.com

или

ip host 1.1.1.1 google.de

Так что следующий шаг, который я хотел сделать, это разделить строку на '' вмассив и запись [2] и [3] в переменные для дальнейшей обработки.

На другом сервере Centos 7.7 это абсолютно не проблема:

IFS=' ' read -ra ADDR <<< $entry

или даже

ip="$(cut -d' ' -f3 <<< "$entry")"
host="$(cut -d' ' -f4 <<< "$entry")"

Однако, при попытке выполнить скрипт в Ubuntu 18.04, кажется, что ничего из решения для сплитов не работает. Я использую mysql-client-core-10.1 для вызова mysql. После некоторых неудачных попыток отладки я вернулся к синтаксическому анализу переменной $ entry.

Здесь я заметил, что при отображении $ entry возвращается полная строка:

echo $entry

returns: ip host 1.1.1.1 google.de

При отображении«$ entry», возвращаются только первые два элемента:

echo "$entry"

returns: ip host

Я думаю, что это источник проблемы здесь, но я не понимаю, почему это работает под CentOS.

Продолжая мой сценарий, разбиения ничего не делают. Я пытался:

IFS=' ' read -ra ADDR <<< $entry

сохраняет: "ip host" в $ ADDR

IFS=' ' read -ra ADDR <<< "$entry"

сохраняет: "ip host" в $ ADDR

ip="$(cut -d' ' -f3 <<< "$entry")"
host="$(cut -d' ' -f4 <<< "$entry")"

сохраняет:«ip host 8.8.8.8 facebook.com» в обеих переменных (и да, на самом деле это работало с кавычками, хотя это должно было сделать из $ ($-cut '' -f4 <<< "строку из моего понимания)</p>

ip="$(cut -d' ' -f3 <<< $entry)"
host="$(cut -d' ' -f4 <<< $entry)"

сохраняет: «ip host 8.8.8.8 facebook.com» в обеих переменных

ip=$(cut -d' ' -f3 <<< $entry)
host=$(cut -d' ' -f4 <<< $entry)

сохраняет: «ip host 8.8.8.8 facebook.com» в обеих переменных

Может кто-нибудь помочь мне с этим, пожалуйста?

Редактировать:

Вывод из getrandom | od -t x1:

0000000 69 70 09 68 6f 73 74 0a 38 2e 38 2e 38 2e 38 09
0000020 66 61 63 65 62 6f 6f 6b 2e 63 6f 6d 0a
0000035

Спасибо, я думаю, что яобратно на ходу:)

i  p  <tab> h  o  s  t <newline> 8  .  8  .  8  .  8 <tab>
f  a  c  e  b  o  o  k  .  c  o  m  <newline>

1 Ответ

0 голосов
/ 07 ноября 2019

В возвращаемом значении клиента mysql были вкладки и символы новой строки ascii. Я удалил их:Эхо возвращает 1.1.1.1 в $ ip и google.de в $ host.

Спасибо stephanmg и oguz ismail за то, что они указали мне правильное направление! =)

Конечно, есть более плавный способ удаления табуляции и новой строки с помощью sed, но я не смог заставить его работать, так что пока есть это неловкое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...