在 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
在脚本中,我有一个函数可以计算传递的 '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