假设我有一个包含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!
答案 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部分,我无法测试,但文档说的是
你有两个问题:
QUOTE
函数根据文档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部分,但必须非常接近。