gpt4 book ai didi

ksh 中的疯狂评估

转载 作者:行者123 更新时间:2023-12-01 08:54:51 25 4
gpt4 key购买 nike

我讨厌 eval...

我被这个 ksh 困住了,它必须是这样的。

我需要这个函数,它将接收一个变量名和一个值。将对该变量的内容和值做一些事情,然后必须更新接收到的变量。排序:

REPORT="a text where TADA is wrong.."

setOutputReport REPORT "this"

echo $REPORT
a text where this is wrong..

函数应该是这样的

function setOutputReport {
eval local currentReport=\$$1
local reportVar=$1
local varValue=$2

newReport=$(echo "$currentReport"|sed -e 's/TADA/$varValue')

# here be dragons
eval "$reportVar=\"$newReport\""
}

我以前也有过这种头痛,一开始从来没有设法正确评估过。这里很重要,REPORT var 可能包含多行(\n)。这可能很重要,因为其中一种尝试仅用第一行就成功地正确替换了变量的内容:/

谢谢。

最佳答案

一个风险,不是使用 eval,而是使用“varValue”作为 sed 命令中的替换:如果 varValue 包含斜杠,sed 命令将中断

local varValue=$(printf "%s\n" "$2" | sed 's:/:\\/:g')
local newReport=$(echo "$currentReport"|sed -e "s/TADA/$varValue/")

如果您的 printf 有 %q 说明符,那将增加一层安全性 -- %q 转义诸如引号、反引号和美元符号之类的内容,以及转义诸如换行符和制表符之类的字符:

eval "$(printf "%s=%q" "$reportVar" "$newReport")"

这是一个 %q 的例子(这是 bash,我希望你的 ksh 版本对应):

$ y='a `string` "with $quotes"
with multiple
lines'
$ printf "%s=%q\n" x "$y"
x=$'a `string` "with $quotes"\nand multiple\nlines'
$ eval "$(printf "%s=%q" x "$y")"
$ echo "$x"
a `string` "with $quotes"
and multiple
lines

关于ksh 中的疯狂评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com