Bash
如何在 bash 數組中擷取 MySQL 結果集?
我在 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 中,單元素數組和標量變數的作用相同。