我正在JACL中修改应用程序退出脚本。此脚本旨在搜索我们要在服务器的JVM参数中删除的JVM参数字符串。应用程序的新增内容此发布周期是一个jvm参数$ {variable_name}。我的旧代码
set ixReplace [lsearch -exact $jvm_args "string_to_search"]
set jvm_args [lreplace $jvm_args $ixReplace $ixReplace]
现在返回一组额外的{}这样的
-Xjit:disableOSR -Xgc:preferredHeapBase=0x100000000 -Xmnx1152m -Xmns512m -Xgcpolicy:gencon -agentlib:getClasses -noverify {${variable_name}}
我发现了多篇关于如何删除额外{} here和here的文章,但我似乎无法将结果设置为我用来设置新的jvm参数的变量。
我的最终目标是将正确的字符串设置为名为jvm_args的变量,以便我可以像这样更新JVM参数。
set attr {}
lappend attr [list genericJvmArguments $jvm_args]
$AdminConfig modify $server_jvm_id $attr
非常感谢任何帮助或建议。
答案 0 :(得分:1)
Tcl添加了这些大括号,因为您在lreplace
操作后获得了格式良好的 Tcl列表,而不是任何旧字符串。大括号阻止${variable_name}
被解释为变量替换; $
是一个Tcl metasyntax角色。 (方括号也会引用引号,其他一些字符也会引用。)
但是,您希望将结果提供给不期望Tcl列表的上下文,而是可能是一个简单的空格分隔字符串。最简单的方法是在你不再考虑使用Tcl单词列表并开始考虑使用一般字符串时使用join
,可能是这样的:
lappend attr [list genericJvmArguments [join $jvm_args]]
如果您在字符串或其他一些案例中嵌入了空格,但又不知道在源材料中使单词成为单词的确切标准或如何引用系统中的东西,这是你可能得到的最好的东西。 (做这么多至少是便宜的......)