IFS = $’n’的确切含义是什么?

如果下面的例子中,它将 IFS环境变量设置为换行符..。

IFS=$'\n'
  • 美元符号是什么意思 确切地说?
  • 它在这个特定的 案子?
  • 我在哪里可以阅读更多关于这个特定用法的内容(谷歌不允许在搜索中使用特殊字符,我不知道在其他情况下该查找什么) ?

我知道什么是 IFS环境变量,什么是 \n字符(换行符) ,但为什么不使用以下形式: IFS="\n"(不工作) ?

例如,如果我想循环遍历文件的每一行并使用 For 循环,我可以这样做:

for line in (< /path/to/file); do
echo "Line: $line"
done

但是,除非将 IFS设置为换行符,否则这种方法不会正确工作。为了让它起作用,我必须这样做:

OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS

注: 我不需要别的方法来做同样的事情,我已经知道很多其他的方法了... ... 我只是对那个 $'\n'很好奇,想知道是否有人可以给我一个解释。

96319 次浏览

来自 http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html:

“ $‘ STRING’”格式的单词是 以一种特殊的方式对待。这个词 扩展为一个字符串,带有 替换反斜杠转义字符 根据 ANSI-C 标准的规定。 反斜杠转义序列可以是 在 Bash 的文件里找到的

我猜这会迫使脚本从换行符转到正确的 ANSI-C 标准。

通常,bash不解释字符串文字中的转义序列。所以如果你写 \n或者 "\n"或者 '\n',这不是一个换行符-它是字母 n(在第一种情况下)或者一个反斜杠后面跟着字母 n(在另外两种情况下)。

$'somestring'是一个 具有转义序列的字符串文字的语法。所以不像 '\n'$'\n'实际上是一个换行符。

这就像从变量中检索值:

VAR='test'
echo VAR
echo $VAR

是不同的,所以美元符号基本上评估的内容。

重新恢复默认的 IFS-这个 OLDIFS=$IFS是不必要的。在 subshell 中运行新的 IFS,以避免覆盖默认的 IFS:

ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )

而且我不相信你能完全恢复原来的 IFS。您应该双倍引用它,以避免行中断,如 OLDIFS="$IFS"

只要给构造它的 官方名称: 字符串的形式 $'...'被称为 ANSI _ 002dC-Quting”rel = “ noReferrer”> ANSI C 引用字符串

也就是说,与[ ANSI ] C 字符串一样,反冲转义序列反冲转义序列被识别出来,扩展到字面上的等价物被识别出来(请参阅下面支持的转义序列的完整列表)。

这个展开之后,$'...'字符串的行为与 '...'字符串 相同-也就是说,它们被视为 不受任何[进一步] shell 扩展的约束

例如,$'\n'展开为一个文字换行符——这是一个常规 bash 字符串文字(无论是 '...'还是 "...")不能做的事情

另一个有趣的特性是 ANSI C 引号字符串可以将 ABC0(单引号)转义为 \',而 '...'(常规的单引号字符串)不能:

echo $'Honey, I\'m home' # OK; this cannot be done with '...'

支持的转义序列列表 :

反斜杠转义序列,如果存在,解码如下:

一 警报(铃声)

B 退回去

你好 E 转义字符(不是 ANSI C)

F 形成饲料

N 新线

R 回程马车

T 水平压片

翻译 垂直标签

\ 反斜杠

\' 单引号

\" 双引号

嗯 值为八进制值 nnn (1到3位)的8位字符

XHH 值为十六进制值 HH (一个或两个十六进制数字)的八位字符

啊 Unicode (ISO/IEC 10646)字符,其值为十六进制值 HHHH (一至四个十六进制数字)

UHHHHHHH Unicode (ISO/IEC 10646)字符,其值为十六进制值 HHHHHHH (1到8个十六进制数字)

一个 control-x 字符

展开的结果是单引号,就好像没有美元符号一样。


但是,您可以将 真的换行符嵌入到“ ...”和“ ...”字符串中; 也就是说,您可以定义跨多行的字符串。

ANSI C 引号字符串是一个关键点。

您可以使用 od 命令测试 ANSI C 引号字符串。

echo -n $'\n' | od -c
echo -n '\n' | od -c
echo -n $"\n" | od -c
echo -n "\n" | od -c

产出:

0000000  \n
0000001


0000000   \   n
0000002


0000000   \   n
0000002


0000000   \   n
0000002

你可以通过输出清楚地知道其含义。

问题:

IFS=$'\n'的确切含义是什么?

答案很简单:

嘿 Bash! 把 内部磁场分离器调到 新线


什么是 IFS

IFS是字符,Bash 在处理字符串时使用字/项边界。

它被设置为 空间标签新线默认情况下的空白字符。

例子一:

IFS使用默认值

string="first second:third forth:fifth"


for item in $string; do
echo "$item"
done

产出:

first
second:third
forth:fifth

例二:

IFS设置为 :

# Set the IFS to collon (:) character
IFS=:


string="first second:third forth:fifth"


for item in $string; do
echo "$item"
done

产出:

first second
third forth
fifth