将字符串解析为令牌,导出和动态回显值

时间:2012-05-07 19:15:29

标签: shell unix scripting ksh shellexecute

环境:KornShell(ksh)

我使用以下方法导出变量:

eval $(echo '"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD"' |  
sed 's/^"/export /g;s/=/="/g;s/#/"\nexport /g')

尝试动态显示这些变量的值:

eval $(echo EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD|sed 's/^/echo $/g;s/=/="/g;s/#/"\necho $/g' | sed  's/=.*$//g')

但我得到的输出为:

20110203-210000 echo Forigen Exchange Today echo EOD

我无法弄清楚为什么会在其中显示额外的回声(这是不是令人满意的输出)。它应该如下所示:

20110203-210000 
Forigen Exchange Today 
EOD

1 个答案:

答案 0 :(得分:1)

您执行替换的方式会丢弃换行符。所以括号内的输出看起来像这样:

echo $EffTimeStamp
echo $InputCtxNm
echo $RunType

但是当您将此作为eval $(...)传递给eval时,您实际上得到了:

echo $EffTimeStamp echo $InputCtxNm echo $RunType

......希望明确表明额外echo的来源。如果你只是在每一行的末尾添加一个分号来标记一个明确的命令结束,它应该做你想要的:

eval $(echo EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD|sed 's/^/echo $/g;s/=/="/g;s/#/"\necho $/g' | sed  's/=.*$/;/g')

其输出为:

20110203-210000
Forigen Exchange Today
EOD