在循环中使用MySQL输出作为BASH函数的输入

时间:2016-08-30 20:18:33

标签: mysql arrays bash function

假设我有一个包含animals列和3行的MySQL表id, name

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!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为我有一些东西,不是100%肯定SQL部分,我无法测试,但文档说的是

你有两个问题:

  1. 使用分离字符保护sql查询输出。 QUOTE函数根据文档
  2. 执行此操作
  3. for循环分裂,无论是否有引号。我已将引号更改为double %%,并将输入字段分隔符更改为%%。
  4. 这是我的剧本

    #!/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部分,但必须非常接近。