在函数中使用变量(传入占位符)

时间:2019-05-07 16:25:02

标签: bash

我正在尝试创建一个函数,该函数可以将查询传递给块中的项目并在其中循环遍历。

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

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"