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

yk9xbfzb  于 2022-11-16  发布在  Shell
关注(0)|答案(7)|浏览(407)

如果以下示例将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'很好奇,不知道有没有人能给予我一个解释。

63lcw9qa

63lcw9qa1#

通常情况下,bash不会解释字符串文字中的转义序列,所以如果你写\n"\n"'\n',那不是换行符,而是字母n(在第一种情况下)或反斜杠后面跟着字母n(在另外两种情况下)。
$'somestring'是一个语法,用于带有转义序列的字符串文字。因此,与'\n'不同,$'\n'实际上是一个换行符。

nvbavucw

nvbavucw2#

为该构造提供正式名称$'...'的字串称为ANSI C引号字串
也就是说,与在[ANSI] C字符串中一样,反冲转义序列被识别并扩展为它们的等效文字(有关支持的转义序列的完整列表,请参见下文)。

在 * 此扩展之后,$'...'字符串的行为方式与'...'字符串相同-即,它们被视为文字 *,不受任何[进一步] shell扩展的影响。

例如,$'\n'扩展为一个文本换行符--这是常规bash字符串文本(无论是'...'还是"...")无法做到的。[1]
另一个有趣的特性是ANSI C引号字符串可以将'(单引号)转义为\',而'...'(常规单引号字符串)则不能:

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

支持的转义序列列表

反斜杠转义序列(如果存在)的解码方式如下:
\警报(铃声)
\B退格
\e \E逸出字符(非ANSI C)
\f换页
\n换行
\r回车
\t水平定位点
\v垂直制表符
\反斜扛
'单引号
\”双引号
\nnn八位字符,其值为八进制值nnn(一到三位数字)
\xHH值为十六进制值HH(一个或两个十六进制数字)的八位字符
\uHHHH Unicode(ISO/IEC 10646)字符,其值为十六进制值HHHH(一到四个十六进制数字)
\UHHHHHHHH Unicode(ISO/IEC 10646)字符,其值为十六进制值HHHHHHHH(一到八个十六进制数字)
\cx控制x字符
展开后的结果用单引号引起来,就好像没有美元符号一样。
[1]但是,您可以在'...'和“...”字符串中嵌入 actual 换行符;例如,您可以定义跨越多行的字符串。

hs1rzwqc

hs1rzwqc3#

http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html开始:
“$'STRING'”形式的单词将以特殊方式处理。该单词将扩展为字符串,并按照ANSI-C标准的指定替换反斜杠转义字符。反斜杠转义序列可以在Bash文档中找到。找到
我猜这是强制脚本将换行符转义为适当的ANSI-C标准。

esbemjvw

esbemjvw4#

重新恢复默认IFS-不需要此OLDIFS=$IFS。在subshell中运行新IFS以避免覆盖默认IFS:

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

另外,我不相信你能完全恢复原来的IFS,你应该用双引号引起来,避免断行,比如OLDIFS="$IFS"

x759pob2

x759pob25#

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

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

1wnzp6jl

1wnzp6jl6#

问题:

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

简单答案:

嘿Bash!将内部字段分隔符(IFS)设置为新行
什么是IFS
IFS是字符,Bash在处理字符串时用作单词/项目边界。
默认情况下,它被设置为 * 空格 制表符 * 和 * 换行符 *、等空白字符

示例1:

使用IFS的默认值

string="first second:third forth:fifth"

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

输出:

first
second:third
forth:fifth

示例2:

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
nfzehxib

nfzehxib7#

这就像从变量中检索值:

VAR='test'
echo VAR
echo $VAR

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

相关问题