在shell函数

时间:2016-07-28 12:10:48

标签: linux unix

我有分配到变量select语句的典型问题, 我尝试了很多选项,但没有一个可以使用..

我有替换上部(列名)的列名的函数。

Upper=(Column1 Column2)  # Array variable

upper_function()
{
query="$1"
for ((i=0;i<${#Upper[@]};i++))
do
query=$(echo "$query" | sed -e "s/\b"${Upper[$i]}"\b/UPPER(${NAME[$i]})/g")
done
SQLQUERY="$query"
}

下面我有SQL语句:

SQLQUERY="Select column1,column2 from table"

现在,我想将column1和column2更改为

upper(column1) and  upper(column2). 

所以我运行函数:

upper_function "$SQLQUERY"

上面的解决方案工作正常,但情况是,而不是

SQLQUERY="$query"

我想让我的函数更自动,并将Select语句的名称分配给变量,例如如下所示:

$2="$query"

然后运行功能:

upper_function "$SQLQUERY" "SQLQUERY"

但它不起作用,我不知道为什么,如何正确分配该变量?感谢

1 个答案:

答案 0 :(得分:1)

这是BashFAQ #6的核心。

printf -v可用于现代(3.1+)版本的bash中的间接作业:

Upper=( column1 column2 )  # Array variable

upper_function() {
  local colname query=$1 varname=$2
  for colname in "${Upper[@]}"; do
    query=$(echo "$query" | sed -e "s/\b"${colname}"\b/UPPER($colname})/g")
  done
  printf -v "$varname" %s "$query"
}

...此后:

upper_function "$SQLQUERY" SQLQUERY

在较旧的外壳上,而不是:

eval "$varname=\$query"

...请注意,您需要相信$varname的值不是恶意的,因为注入该变量的代码将由该函数运行。因此,您永远不会想要使用文件名,表名或其他可能受攻击者控制的变量来命名以这种方式分配的变量。