Bash

如何在 bash 數組中擷取 MySQL 結果集?

  • June 3, 2018

我在 CentOS 7 上使用 bash shell。我想從 shell 腳本執行 MySQL 查詢並遍歷每一行結果。如果返回 4 行,我想我可以像這樣擷取數組中的四行:

query="select p.id, p.ebook_id, es.id FROM ...";
echo "$query" > /tmp/query.sql
mysql -u user --password=pass db_id < /tmp/query.sql > /tmp/query.csv

linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
arraylength=${#linesIN[@]}
echo $arraylength

但是,即使我可以看到返回的多個結果行,也$arraylength總是輸出。1如何修改上述內容以正確創建結果數組,其中數組中的每個元素代表結果集中的一行?

使用--batch選項mysql應該在一行上輸出一條記錄,並用製表符分隔列。您可以使用Bashmapfile和程序替換或命令替換和數組賦值將這些行讀取到數組中:

mapfile results  < <( mysql --batch ... < query.sql )

或者

set -f        # disable globbing
IFS=$'\n'     # set field separator to NL (only)
results=( $(mysql --batch ... ) )

(請注意,IFS在此之後保持修改和禁用萬用字元。)

然後,如果要將一行的列拆分為一些變數:

IFS=$'\t' read -r col1 col2 col2 ... <<< "${results[0]}"

你的任務

linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`

不是數組賦值(它缺少括號)。它只是將命令替換的輸出分配給正常字元串變數。(任何換行符都將嵌入其中,但它仍然是單個字元串。)${#linesIN[@]}仍然有效,因為在 Bash/ksh 中,單元素數組和標量變數的作用相同。

引用自:https://unix.stackexchange.com/questions/446748