在KSH

2011-08-09 59 views
3

人我討厭eval評估和演示瘋狂......在KSH

我堅持這個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\"" 
} 

我有這個頭痛之前,從來沒有管理首先得到這個EVAL權利。這裏重要的是,REPORT var可以包含多行(\n's)。這可能是重要的,因爲其中一項嘗試設法正確地用第一行代替變量的內容:/

謝謝。

回答

2

一個風險,不與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做一個例子(這是慶典,我希望你的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