打印IFS字符

如何解决打印IFS字符

我注意到要在外壳中打印$IFS变量的值,我必须做类似的事情:

$ printf '%s\nYour IFS is: %q' 'Hello' "$IFS"
Hello
Your IFS is: $' \t\n'

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

  • $ echo $IFS-一些显示特殊字符的参数?
  • $ printf "$IFS"$ printf '$IFS' -为什么这些方法都不起作用?
  • 为什么$ printf "%q" $IFS$ printf "%q" '$IFS'不能正确显示$ printf "%q" "$IFS"可以正确显示

解决方法

  • $ echo $IFS-一些显示特殊字符的参数?

echo没有这样的参数

  • $ printf "$IFS" or $ printf '$IFS'-为什么这些方法都不起作用?
  1. 第一个方法像echo一样对字符串进行插值,并像原样打印IFS字符串-默认情况下是一堆空白。
  2. 第二个不进行插值,显然会打印$IFS
  • printf "%q" $IFS

该变量已被扩展为空格,这些空格已被shell占用,因此没有任何内容作为第二个参数传递给printf,因此%q没有任何输入。

  • printf "%q" '$IFS'

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

,

您遇到了三个基本问题:

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

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

  • 单引号字符串(如printf '$IFS'printf "%q" '$IFS'中)完全不进行变量扩展。在这种情况下,$IFS只是文字字符串,而不是变量引用。

  • 最后,$IFS中的默认字符在屏幕上并不是特别明显。 printf "$IFS"实际上确实正确打印了它们(除非出于某种原因在%中放入了“ \”或“ IFS”),但是您看不到它们。默认情况下,$IFS中的第一个字符是空格,因此在打印时,光标将移动到第二列,但看不到任何可见内容。第二个字符是一个制表符,因此光标会移到更远的位置,但实际上仍然看不到任何内容。然后,最后一个字符是换行符,因此光标将移至下一行的开头...同样,没有任何可见的显示。

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

,

如果不引用该变量,则在扩展变量后进行单词拆分。单词拆分将IFS中的所有字符视为单词定界符;单词之间连续的多个单词被折叠到一个空格中,如果输出完全是定界符,则什么都不会输出。

您需要在变量周围使用引号将其按字面输出。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?