我在两个表达式中使用了十六进制。有一个小的区别,我想更多地了解它,…
thierry@toto-PC:~> hexdump -C <<< "$IFS"
00000000 20 09 0a 0a | ...|
00000004和
thierry@toto-PC:~> hexdump -C <<< $(echo "$IFS")
00000000 20 09 0a | ..|
00000003我知道0a (行馈送)表示行尾。
我试着解释一下。
( Case_1) shell变量IFS包含每个默认的2090A0A。这意味着三个值:空白20、表格09和行提要0a。所有内容都是扩展的,但是由于双引用,在末尾追加了另一行提要0a。因此,第一个流是2090A0A,并被认为是这里字符串…的行。
( Case_2) $(echo "$IFS")。
只有回波"$IFS“生成2090A0A,它类似于Case_1或如下所示:
thierry@toto-PC:~> echo "$IFS" | hexdump -C
00000000 20 09 0a 0a | ...|
00000004然后,命令替换消除了该流末尾的第一个0a。为什么?命令替换查看IFS shell变量的值并查找0a。因此,命令替换将第一个0a (在20090A0A中)看作一个分隔符,但它的值与最后一个字符0a相同,因此消除了第一个0a。
最后,在Case_2中逻辑地读取:20.090A。
是对的吗?
注释:在这种情况下,的值在case_2中是假的,我的意思是这不是期望值。)我不认为这是个虫子。它工作得很好!)
发布于 2021-11-16 22:25:16
你的解释部分正确。shell变量IFS确实包含空格、选项卡、换行符(20.090A)。由于双引用,不是,而是在末尾追加了另一行提要0a,而是因为<<<,请参阅这里的Strings
结果以单个字符串的形式提供,并附加一个换行符到命令…。
的确,回声"$IFS“可以产生2090A0A。命令替换消除了这个流末尾的第一个0a (仅为),这不是真的,而是删除了任何尾随的换行符,参见命令替换。在此之后,<<<再次追加一个换行符。
https://stackoverflow.com/questions/69963009
复制相似问题