首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印IFS字符

打印IFS字符
EN

Stack Overflow用户
提问于 2020-09-04 07:11:10
回答 3查看 358关注 0票数 0

我注意到要在shell中打印$IFS变量的值,必须执行以下操作:

代码语言:javascript
复制
$ printf '%s\nYour IFS is: %q' 'Hello' "$IFS"
Hello
Your IFS is: $' \t\n'

我的问题是,为什么我需要以那种特殊的方式通过IFS?例如,为什么(或为什么不能)可以这样做:

  • $ echo $IFS --一些打印特殊characters?
  • $ printf "$IFS"$ printf '$IFS'的参数--为什么这些参数都不能工作?为什么
  • $ printf "%q" $IFS$ printf "%q" '$IFS'没有正确地显示这一点,但是$ printf "%q" "$IFS"显示了?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-04 07:25:25

  • $ echo $IFS --一些打印特殊字符的参数?

echo没有这样的参数

  • $ printf "$IFS" or $ printf '$IFS' --为什么这两种方法都不起作用?--

第一个做字符串的插值,就像whitespaces.

  • The做的一样,并打印IFS字符串,这在默认情况下是一堆$IFS.

,第二个不做插值,并且很明显地打印了$IFS.。

  • printf "%q" $IFS

该变量已经扩展到由shell占用的空白空间中,因此没有任何东西作为第二个参数传递给printf,因此%q没有可以使用的输入。

  • printf "%q" '$IFS'

字符串$IFS作为参数传递给%q%q只向其添加转义字符。

票数 2
EN

Stack Overflow用户

发布于 2020-09-04 07:30:08

您遇到了三个基本问题:

  • 未引号的变量引用(如echo $IFSprintf "%q" $IFS中的引用)会进行分词。基本上,变量值中的任何空格都被视为“word”(这些单词作为参数传递给命令)之间的分隔符。但是“空格”被定义为$IFS中的字符(这就是它的作用!)因此,整个变量的值被视为仅仅是间隔,而不是实际的内容,并有效地消失了!

这是为什么应该在变量引用周围加上双引号的众多例子之一。

  • 单引号字符串(如printf '$IFS'printf "%q" '$IFS')根本不进行变量展开。在这些情况下,$IFS只是一个文字字符串,而不是变量引用。

最后,

  • 在屏幕上看不到$IFS中的默认字符。printf "$IFS"确实正确地打印了它们(除非您出于某种原因将"%“或"\”放在IFS中),但您无法真正看到它们。默认情况下,$IFS中的第一个字符是空格,因此当打印光标时,游标移动到第二列,但不会出现任何可见字符。第二个字符是一个制表符,因此光标移动得更远,但实际上什么都看不见。最后一个字符是换行符,所以光标移动到下一行的开头.再一次,什么也看不见。

这就是为什么需要printf %q的原因-- %q格式将$IFS中不可见的字符转换为可见的、可读的$IFS

票数 2
EN

Stack Overflow用户

发布于 2020-09-04 07:18:18

如果不引用变量,则在扩展变量后进行分字操作。单词拆分将IFS中的所有字符视为单词分隔符;在单词之间一行中的多个字符被折叠到一个空格中,如果输出完全是分隔符,则根本不输出任何字符。

您需要在变量周围使用引号来逐字输出它。

然后,您需要使用%q格式运算符将其输出为转义序列,这样您就可以看到各个字符是什么。否则,您将无法分辨第二个字符是一个TAB,您只会看到一堆空格在屏幕上。换行符就会转到下一行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63736467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档