2016-08-30 4 views
0

のは、私が列id, nameと3行でMySQLのテーブルanimalsを持っているとしましょう:使用のMySQL出力

1, Mountain Goat 
2, Angry Chicken 
3, Weird Llama 

私はコマンドanimals=$(mysql -u root -e 'SELECT name FROM animals')を実行した場合、私は結果Mountain Goat Angry Chicken Weird Llamaを取得します。

動物を配列animals=("Mountain Goat" "Angry Chicken" "Weird Llama")にハードコードし、コマンドecho ${animals[1]}で配列の2番目のエントリにアクセスしようとすると、 "Angry Chicken"ではなく出力Angryが得られます。

最終的には、各値animals.nameをBASHの関数に渡します。以下のサンプルスクリプトを参照してください。

#!/bin/bash 
animals=$(mysql -u root -e 'SELECT name FROM animals') 
function showAnimal { 
    echo "Wow, look at the "$1"!"; 
} 
for i in $animals; do 
    showAnimal ${animals[$i]} 
done 
showAnimal 

とget次の結果:

Wow, look at the Mountain Goat! 
Wow, look at the Angry Chicken! 
Wow, look at the Weird Llama! 

答えて

0

は、私はSQLの部分については、100%確実ではない何かを持っていると思うし、私がテストすることはできませんが、ドキュメントには、あなたは2を持っている

そう語ります問題:

  1. 分離文字でSQLクエリの出力を保護しています。 QUOTE関数は、ドキュメントによると、引用符があるかどうかにかかわらず、ループによって分割されます。
  2. ループは分割されます。二重引用符を%%に変更し、入力フィールド区切り文字を%%にも変更しました。

ここに私のスクリプトは、私は、コマンド によって返さ引用符で囲まれた文字列のリストを解析するためのより良い解決策が存在し、私は配列と、そのようなを試してきたが、それを作ることができなかったと確信している

#!/bin/bash 
animals=$(mysql -u root -e 'SELECT QUOTE(name) FROM animals' | sed -e "s#' '#%%#g" -e "s#'##g") 
# mockup test below, worked for me 
#animals=$(echo \'Mountain Goat\' \'Angry Chicken\' \'Weird Llama\' | sed -e "s#' '#%%#g" -e "s#'##g")  

IFS=%% 

function showAnimal { 
    echo "Wow, look at the "$1"!"; 
} 
for i in $animals; do 
    if [ "$i" != "" ] ; then 
    showAnimal $i 
    fi 
done 

です上記のことは仕事ですが、 そして、私はSQLの部分をテストすることができませんでしたが、かなり近いはずです。

1

問題は、単純な変数の場合は、animalsを(誤って)配列として扱うことです。

bash -xでスクリプトを実行すると、関数に動物を1つずつ渡すのではなく、すべての動物をパラメータとしてshowAnimal関数を呼び出していることがわかります。

#!/bin/bash 
animals=$(mysql -u root -e 'SELECT name FROM animals') 
function showAnimal { 
    echo "Wow, look at the "$1"!"; 
} 
for i in $animals; do 
    showAnimal $i 
done 

あなたがする必要があるすべてはあなたのループ内でshowAnimal関数に渡すパラメータを修正することです