我正在尝试创建一个函数,该函数可以将查询传递给块中的项目并在其中循环遍历。
scale=10
loops=10
function runQuery (){
loop=1
lower=1
upper=scale
while [ $loop -le $loops ]; do
echo "Loop -> $loop between $lower and $upper"
mysql -NB -h 127.0.0.1 -e "$query"
let loop=$loop+1
let lower=lower+scale
let upper=upper+scale
done
}
query='delete from x where id between $lower and $upper'
runQuery
在上面的示例中,当传入查询而不是在函数中使用$lower
和$upper
时,变量被设置为空字符串。我猜我需要做的是传递一个将在函数内定义的变量的占位符...这些变量已在echo语句中正确替换,但没有在query
中。我可以轻松地将查询放入函数中,但是我希望能够在多个表上运行此查询并发送不同的查询,而不必重复整个脚本中设置的所有循环变量。
我已经做了很多搜索,但是不确定我在搜索正确的东西...
BASH版本3.2
答案 0 :(得分:2)
参数扩展仅对字符串执行一次,即"$query"
扩展为delete from x where id between $lower and $upper
,仅此而已,bash不会扩展$lower
和$upper
。
无论如何,这根本不是一个好主意,任何可能的解决方法都将使您的脚本可以进行代码注入。
因此,如果您的printf
支持-v
选项,请创建如下查询模板:
query_templ='delete from x where id between %d and %d'
并使用它来生成查询:
printf -v 'query' "$query_templ" "$lower" "$upper"
mysql -NB -h 127.0.0.1 -e "$query"
答案 1 :(得分:0)
function runQuery (){
loop=1
lower=1
upper=$scale
while [ $loop -le $loops ]; do
echo "Loop -> $loop between $lower and $upper"
mysql -NB -h 127.0.0.1 -e `eval echo "$query"`
let loop=$loop+1
let lower=lower+scale
let upper=upper+scale
done
}
scale=10; loops=10
query='delete from x where id between $lower and $upper'
runQuery "$query"