提问人:notatclgenius 提问时间:11/4/2023 更新时间:11/4/2023 访问量:59
如何打印存储在TCL变量中的“\n”
How to print "\n" stored in variable in TCL
问:
我有一个由用户设置的变量,假设 a 是“/n/nhelloworld”,我不希望“\n”创建新行,而是打印它。
基本上,对于没有格式的变量值的输出,只有原始文本。
因为它存储在变量中并由用户设置,所以我不能使用 {} 而不是“”,或者至少我尝试过但没有用
答:
3赞
dana
11/4/2023
#1
您可以直接转义反斜杠,如下所示:
set a "\n\nhelloworld"
set b [string map {"\n" "\\n"} $a]
然后打印$b
评论
0赞
dana
11/4/2023
这只是一个例子,如果正如你所说,$<var> 已经由另一个用户设置了 eq “\n\nhelloworld”,它当然仍然以同样的方式工作
0赞
Donal Fellows
11/4/2023
还要记住,您可以在同一个通话中同时做很多事情。这简化了将换行符转换为换行符和反斜杠同时转换为 \\ 之类的操作。string map
\n
0赞
Cyan Ogilvie
11/4/2023
#2
如果文字字符序列在变量中,则打印出来的内容 - 输出值时不执行替换。反斜杠替换(即将 2 个字符的序列转换为代码点 10:换行符)仅在解析 Tcl 脚本中的文本值时发生;通过命令 unless 给出,以及带引号的字符串中的命令(或其他将其参数视为表达式的命令:、、等)。\n
puts
\n
subst
-nobackslashes
expr
if
while
for
set msg [format hello%cnworld 0x5C] ;# codepoint 0x5C is backslash
puts $msg ;# prints "hello\nworld"
# Show the hex values of all the bytes of the UTF-8 string
# to prove that the sequence "\n" (0x5C 0x6E) is in the value
puts [regexp -all -inline .. [binary encode hex [encoding convertto utf-8 $msg]]]
如果您从用户那里收到包含序列的字符串,但该字符串显示为换行符,则几乎可以肯定存在远程代码执行漏洞(由用户提交的值经历解析和替换阶段引起,其中可能包括脚本替换 - 用户提供的任何代码都将运行)。检查没有大括号的表达式,s 等。\n
eval
评论
lets say a is "\n\nhelloworld"