У меня есть сценарий, который обращается к центральному серверу базы данных (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>