2016-08-30 57 views
0

比方說,我有一個MySQL表animals的列id, name 3行:使用MySQL輸出爲BASH函數輸入循環

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]}訪問數組的第二個條目,我得到的輸出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 

,並得到以下結果:

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

回答

0

我想我有事,不能100%地肯定了SQL的一部分,我不能測試,但醫生說這樣

你有2問題:

  1. 使用分隔字符保護sql查詢輸出。 QUOTE功能根據文檔
  2. 這個for循環拆分,無論是否有引號。我已經將引號更改爲double %%,並將輸入字段分隔符更改爲%%。

這裏是我的腳本

#!/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運行腳本,您將看到您將所有動物作爲參數調用showAnimal函數,而不是將動物逐個傳遞給函數。

所有你需要做的是解決你傳遞給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