如果以下示例将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'
很好奇,不知道有没有人能给予我一个解释。
7条答案
按热度按时间63lcw9qa1#
通常情况下,
bash
不会解释字符串文字中的转义序列,所以如果你写\n
或"\n"
或'\n'
,那不是换行符,而是字母n
(在第一种情况下)或反斜杠后面跟着字母n
(在另外两种情况下)。$'somestring'
是一个语法,用于带有转义序列的字符串文字。因此,与'\n'
不同,$'\n'
实际上是一个换行符。nvbavucw2#
为该构造提供正式名称:
$'...'
的字串称为ANSI C引号字串。也就是说,与在[ANSI] C字符串中一样,反冲转义序列被识别并扩展为它们的等效文字(有关支持的转义序列的完整列表,请参见下文)。
在 * 此扩展之后,
$'...'
字符串的行为方式与'...'
字符串相同-即,它们被视为文字 *,不受任何[进一步] shell扩展的影响。例如,
$'\n'
扩展为一个文本换行符--这是常规bash字符串文本(无论是'...'
还是"..."
)无法做到的。[1]另一个有趣的特性是ANSI C引号字符串可以将
'
(单引号)转义为\'
,而'...'
(常规单引号字符串)则不能:支持的转义序列列表:
反斜杠转义序列(如果存在)的解码方式如下:
\警报(铃声)
\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 换行符;例如,您可以定义跨越多行的字符串。
hs1rzwqc3#
从http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html开始:
“$'STRING'”形式的单词将以特殊方式处理。该单词将扩展为字符串,并按照ANSI-C标准的指定替换反斜杠转义字符。反斜杠转义序列可以在Bash文档中找到。找到
我猜这是强制脚本将换行符转义为适当的ANSI-C标准。
esbemjvw4#
重新恢复默认IFS-不需要此
OLDIFS=$IFS
。在subshell中运行新IFS以避免覆盖默认IFS:另外,我不相信你能完全恢复原来的IFS,你应该用双引号引起来,避免断行,比如
OLDIFS="$IFS"
。x759pob25#
ANSI C引号字符串是一个关键点。
您可以使用命令od测试ANSI C引号字符串。
输出:
你可以通过输出清楚地知道含义。
1wnzp6jl6#
问题:
IFS=$'\n'
的确切含义是什么?简单答案:
嘿Bash!将内部字段分隔符(IFS)设置为新行
什么是
IFS
?IFS
是字符,Bash在处理字符串时用作单词/项目边界。默认情况下,它被设置为 * 空格 、 制表符 * 和 * 换行符 *、等空白字符。
示例1:
使用
IFS
的默认值输出:
示例2:
将
IFS
设置为:
输出:
nfzehxib7#
这就像从变量中检索值:
是不同的,所以美元符号基本上评估内容。