
我在 CentOS 7 上使用 bash shell。如果返回 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
如何修改上述內容以正確建立結果數組,其中數組中的每個元素代表結果集中的一行?
答案1
隨著--batch
選項,mysql
應將結果輸出為一行中的一筆記錄,並且各列之間以製表符分隔。您可以使用以下命令將行讀取到數組中巴什的mapfile
和進程替換,或命令替換和數組賦值:
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 中單元素數組和標量變數的行為相同。
答案2
另一種方法是將命令的輸出透過管道傳輸到 while 循環。請注意,您要包含 -N 或結果包含列名稱。
#!/bin/bash
#Script to read output from a mysql command line by line
mysql -uroot -p example -N -e "select column from table" | while IFS= read -r loop
do
echo "$loop"
done
如果您只想計數,您可以執行 aselect count(columnName)
並列印出結果。
答案3
如果您想要檔案中的行數等於查詢傳回的行數,只需使用wc
計算檔案中的行數即可
arraylength=$( wc -l < /tmp/query.csv)
echo $arraylength