簡體   English   中英

Bash - 在 Ubuntu 18 中從 mysql-client 解析中拆分字符串的問題

[英]Bash - problem with splitting string from mysql-client parse in Ubuntu 18

我有一個腳本,它訪問中央數據庫服務器(CentOS 7.7 上的 mariadb 10.2)以獲取隨機數據庫條目。

#!/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)

數據庫有條目,即:

+----+---------+--------------+
| id | ip      | host         |
+----+---------+--------------+
|  2 | 8.8.8.8 | facebook.com |
|  3 | 1.1.1.1 | google.de    |
+----+---------+--------------+

因此,mysql select 應該得到以下字符串:

ip host 8.8.8.8 facebook.com

或者

ip host 1.1.1.1 google.de

所以下一步我想做的是將字符串按''分割成一個數組,並將[2]和[3]寫入vars以進行進一步處理。

在另一台 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 var 的解析。

在這里,我注意到在回顯 $entry 時,會返回完整的字符串:

echo $entry

returns: ip host 1.1.1.1 google.de

回顯“$entry”時,僅返回前兩個元素:

echo "$entry"

returns: ip host

我認為,這是問題的根源,但我不明白,為什么這在 CentOS 下工作。

繼續我的腳本,拆分什么都不做。 我試過了:

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

保存:$ADDR 中的“ip host”

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

保存:$ADDR 中的“ip host”

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

保存: "ip host 8.8.8.8 facebook.com" 在兩個變量中(是的,這實際上與引號一起使用,即使這應該使 "$(cut -d' ' -f4 <<< " 成為我的字符串理解)

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”

有人可以幫我解決這個問題嗎?

編輯:

Output 來自getrandom | od -t x1 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>

mysql 客戶端的返回值中有制表符和換行符。 我刪除了它們:

entry=$(echo "${entry//$'\t'/','}")
entry=$(echo "${entry/$'\n'/','}")

之后,hexdump 返回:

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

從那里開始,它與 CentOS 上的相同:

IFS=',' read -r -a array <<< "$entry"
ip=${array[2]}
host=${array[3]}

Echo 在 $ip 中返回1.1.1.1 ,在 $host 中返回google.de

感謝 stephanmg 和 oguz ismail 為我指明了正確的方向! =)

當然,使用 sed 可以更順暢地刪除制表符和換行符,但我無法讓它工作,所以現在有這個尷尬的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM