【问题标题】:Assign into named variable within a shell function [duplicate]在shell函数中分配给命名变量[重复]
【发布时间】:2016-12-02 19:44:51
【问题描述】:

我有分配到变量选择语句的典型问题, 我已经尝试了很多选项,但它们都不起作用..

我有替换上部列名的功能(列名)。

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"

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

【问题讨论】:

  • Upper=(Column1,Column2) 只有一个元素,Column,Column2——如果你想让它们成为两个独立的元素,你需要在它们之间留一个空格:Upper=( Column1 Column2 )
  • Charles,我是无意中这样做的(复制和粘贴错误)。我编辑了我的问题,数组变量现在可以正常工作。仍然是变量分配的问题
  • ...现在,您只是希望能够传递变量的 name 以用作源和目标吗?这很容易。
  • 是的,这就是我想要做的就是运行我的函数作为 upper_function "$SQLQUERY" "SQLQUERY" ,所以 2 个变量...
  • 是的,你是对的,我不会在不解释编辑内容的情况下编辑我的问题

标签: linux unix


【解决方案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

在较旧的 shell 上,改为:

eval "$varname=\$query"

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

【讨论】:

  • 回到你的上一条信息:关于间接分配只有一个问题(第一次听说这样的事情)。我做的第一件事是在谷歌搜索信息,但没有找到,没有任何效果,所以我决定把这个问题放在这里。不过非常感谢您的帮助问候
  • 现在我注意到你编辑了你的答案。感谢您的解释。问候
猜你喜欢
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2019-07-21
相关资源
最近更新 更多