在 bash 的“$value”中使用空格评估 "key=value" 失败

Evaluating "key=value" with whitespaces in "$value" in bash fails

在脚本中,我有一个函数可以计算传递的 'key=value' 参数,即:

function evaluateKeyValuePair() {
    eval ""
}

evaluateKeyValuePair "key=value with whitespaces"
evaluateKeyValuePair "key=value"

后一个调用工作正常,"echo $key" 打印 "value"。 但是,在 "value" 中调用带有空格的函数不起作用:为 "with" 和 "whitepaces"

抛出命令未找到错误

我已经读到,通常使用 eval 是个坏主意。但是,不幸的是我不能改变功能的基本布局。我只能忍受它。

我尝试将其更改为:

function evaluateKeyValuePair() {

    key="${1%%=*}"
    val2="${1#*"="}"

    eval $key="$val2"
}

但这也不起作用。

有没有一种方法可以评估 "value" 中带有空格的键值对值,或者我是否必须测试传递的参数中的空格并且 return 如果有任何错误?

提前致谢!

尝试使用单引号

function evaluateKeyValuePair() {
    eval ""
}

evaluateKeyValuePair 'key="value with whitespaces"'
evaluateKeyValuePair "key=value"

你也可以像这样转义双引号:

evaluateKeyValuePair "key=\"value with whitespaces\""

通过你的第二次尝试和答案 here 你可以在没有评估的情况下做你想做的事:

function evaluateKeyValuePair() {
    key="${1%%=*}"
    val2="${1#*"="}"

    printf -v $key "$val2"
}

evaluateKeyValuePair "key=value with whitespaces"
printf "%s\n" "$key"

这将打印 value with whitespaces

在 bash 中,您可以使用内置的 declare 而不是 eval 来执行赋值。这避免了在参数中插入转义引号。

请注意,在函数中,declare 等同于 local,因此有必要添加 -g(全局)标志(在 v4.2 中实现;在此之前那,你将不得不使用 export 来避免使变量局部化):

evaluateKeyValuePair() {
  declare -g ""
}

示例:

$ evaluateKeyValuePair "key=value with whitespaces"
$ echo "$key"
value with whitespaces