我注意到要在shell中打印$IFS变量的值,必须执行以下操作:
$ 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"显示了?发布于 2020-09-04 07:25:25
$ echo $IFS --一些打印特殊字符的参数?echo没有这样的参数
$ printf "$IFS" or $ printf '$IFS' --为什么这两种方法都不起作用?--第一个做字符串的插值,就像whitespaces.
IFS字符串,这在默认情况下是一堆$IFS.
,第二个不做插值,并且很明显地打印了$IFS.。
printf "%q" $IFS该变量已经扩展到由shell占用的空白空间中,因此没有任何东西作为第二个参数传递给printf,因此%q没有可以使用的输入。
printf "%q" '$IFS'字符串$IFS作为参数传递给%q,%q只向其添加转义字符。
发布于 2020-09-04 07:30:08
您遇到了三个基本问题:
echo $IFS和printf "%q" $IFS中的引用)会进行分词。基本上,变量值中的任何空格都被视为“word”(这些单词作为参数传递给命令)之间的分隔符。但是“空格”被定义为$IFS中的字符(这就是它的作用!)因此,整个变量的值被视为仅仅是间隔,而不是实际的内容,并有效地消失了!这是为什么应该在变量引用周围加上双引号的众多例子之一。
printf '$IFS'和printf "%q" '$IFS')根本不进行变量展开。在这些情况下,$IFS只是一个文字字符串,而不是变量引用。最后,
$IFS中的默认字符。printf "$IFS"确实正确地打印了它们(除非您出于某种原因将"%“或"\”放在IFS中),但您无法真正看到它们。默认情况下,$IFS中的第一个字符是空格,因此当打印光标时,游标移动到第二列,但不会出现任何可见字符。第二个字符是一个制表符,因此光标移动得更远,但实际上什么都看不见。最后一个字符是换行符,所以光标移动到下一行的开头.再一次,什么也看不见。这就是为什么需要printf %q的原因-- %q格式将$IFS中不可见的字符转换为可见的、可读的$IFS。
发布于 2020-09-04 07:18:18
如果不引用变量,则在扩展变量后进行分字操作。单词拆分将IFS中的所有字符视为单词分隔符;在单词之间一行中的多个字符被折叠到一个空格中,如果输出完全是分隔符,则根本不输出任何字符。
您需要在变量周围使用引号来逐字输出它。
然后,您需要使用%q格式运算符将其输出为转义序列,这样您就可以看到各个字符是什么。否则,您将无法分辨第二个字符是一个TAB,您只会看到一堆空格在屏幕上。换行符就会转到下一行。
https://stackoverflow.com/questions/63736467
复制相似问题