shell 如何打印TCL变量中存储的“\n”

pzfprimi  于 11个月前  发布在  Shell
关注(0)|答案(2)|浏览(168)

我有一个由用户设置的变量,假设a是“/n/nhelloworld”,我不希望“\n”创建新行,而是将其打印出来。
基本上是输出变量值,没有格式化,只有原始文本。
因为它存储在变量中并由用户设置,所以我不能使用{}代替“",或者至少我尝试过,但它不起作用

7y4bm7vi

7y4bm7vi1#

你可以对反斜杠进行转义,如:

set a "\n\nhelloworld"
set b [string map {"\n" "\\n"} $a]

字符串
然后打印$B

4bbkushb

4bbkushb2#

如果文字字符序列\n在变量中,则将使用puts打印输出-输出值时不执行替换。反斜杠替换(这是将2个字符序列\n转换为代码点10:linefeed的原因)仅在解析Tcl脚本中的文字值时发生;除非给出-nobackslashes,否则由subst命令执行,并由带引号的字符串中的expr命令执行(或将其参数视为表达式的其他命令:ifwhilefor等)。

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]]]

字符串
如果你从用户那里接收到一个包含序列\n的字符串,但它显示为一个换行符,那么你几乎肯定有一个远程代码执行漏洞(由用户提交的值经过一个解析和替换阶段引起的,这可能包括脚本替换-用户提供的任何代码都将运行)。检查没有大括号引号的表达式,eval s等。

相关问题