14

私のスクリプトは、クエリの結果を構造体に格納する必要があります。

 #!/bin/bash
 user="..."
 psw="..."
 database="..."
 query="select name, mail from t"
 customStructure=$(mysql -u$user -p$psw $database -e "$query";)

クエリ結果から {name, mail} の配列を保存する方法がわかりません..

次のような構造が必要です。

 array=[ [name1,mail1] , [name2,mail2], ....., [nameN, mailN] ]

これをbashで行う方法はありますか?

4

2 に答える 2

17

Bash 配列は次のように初期化されます。

myarray=("hi" 1 "2");

コマンドの出力の個々の部分を配列にキャプチャするには、出力をループして、その結果を配列に追加する必要があります。それは次のように行うことができます:

for i in `echo "1 2 3 4"`
do
    myarray+=($i)
done

あなたの例では、MySQL コマンドの出力を取得し、その出力行の一​​部をサブ配列に格納したいようです。行を配列にキャプチャする方法を説明します。それを考えると、部分配列を自分で配置する方法を理解できるはずです。

while read line
do 
    myarray+=("$line")
done < <(mysql -u${user} -p${psw} ${database} -e "${query}")

この種の MySQL 操作では、出力メタデータ (きれいな書式設定やテーブル名など) が必要ない場合、MySQL の-Bオプションを使用して「バッチ出力」を実行できることにも言及する価値があります。

于 2012-12-12T16:30:33.560 に答える
3

read -aフィールド レベル レコードは、コマンドを介してアクセスできIFS、読み取りによって行の先頭と末尾の空白が取り除かれないように、空の文字列に設定されます。

#!/bin/bash
user="..."
psw="..."
database="..."
query="select name, mail from t"

OIFS="$IFS" ; IFS=$'\n' ; oset="$-" ; set -f

while IFS="$OIFS" read -a line 
do 
  echo ${line[0]}   
  echo ${line[1]}   
done < <(mysql  -u${user} -p${psw} ${database} -e "${query}")
于 2015-06-12T08:32:22.023 に答える