Bash IFS=$'的确切含义是什么\n';?
如果以下示例将Bash IFS=$'的确切含义是什么\n';?,bash,shell,variables,environment-variables,ifs,Bash,Shell,Variables,Environment Variables,Ifs,如果以下示例将IFS环境变量设置为换行字符 IFS=$'\n' 美元符号是什么意思 确切地说 它在这个特定的环境中做什么 案子 我在哪里可以读到更多关于这个特定用法的信息(谷歌不允许在搜索中使用特殊字符,我也不知道要找什么其他的) 我知道什么是IFS环境变量,什么是\n字符(换行符),但为什么不使用以下形式: IFS=“\n”(哪个不起作用) 例如,如果我想循环文件的每一行并使用For循环,我可以这样做: for line in (< /path/to/file); do e
IFS
环境变量设置为换行字符
IFS=$'\n'
- 美元符号是什么意思 确切地说
- 它在这个特定的环境中做什么 案子
- 我在哪里可以读到更多关于这个特定用法的信息(谷歌不允许在搜索中使用特殊字符,我也不知道要找什么其他的)
IFS
环境变量,什么是\n
字符(换行符),但为什么不使用以下形式:
IFS=“\n”
(哪个不起作用)
例如,如果我想循环文件的每一行并使用For循环,我可以这样做:
for line in (< /path/to/file); do
echo "Line: $line"
done
注意:我不需要其他方法来做同样的事情,我已经知道很多其他方法了。。。我只是对这个$'\n'
感到好奇,想知道是否有人能给我一个解释。来自:
格式为“$'STRING'”的单词是
以特殊的方式对待。字眼
展开为字符串,带有
已替换反斜杠转义字符
按照ANSI-C标准的规定。
可以使用反斜杠转义序列
在Bash文档中找到。找到
我猜这迫使脚本将换行符转义到正确的ANSI-C标准。通常
bash
不会以字符串文本解释转义序列。因此,如果你写\n
或“\n”
或'\n'
,那不是换行符-它是字母n
(在第一种情况下)或反斜杠后跟字母n
(在另外两种情况下)
$'somestring'
是带有转义序列的字符串文本的语法。因此,与'\n'
不同,$'\n'
实际上是一个换行符。这就像从变量中检索值:
VAR='test'
echo VAR
echo $VAR
是不同的,因此美元符号基本上用于评估内容。重新恢复默认的IFS-此
OLDIFS=$IFS
不是必需的。在子shell中运行新的IFS以避免覆盖默认IFS:
ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )
此外,我真的不相信你能完全恢复旧的如果。您应该双引号引用它,以避免断行,例如
OLDIFS=“$IFS”
只是为了给构造提供它的正式名称:形式为$'…'
的字符串称为
也就是说,正如在[ANSI]C字符串中一样,齿隙转义序列被识别并扩展为其字面等价物(有关支持的转义序列的完整列表,请参见下文)
在此扩展之后,$'…'
字符串的行为方式与'…'
字符串的行为方式相同,即它们被视为文本,不受任何[进一步]shell扩展的约束
例如,$'\n'
扩展为文字换行符-这是常规bash字符串文字(无论是'.'.
还是.'.'.'.'.
)无法执行的操作。[1]
另一个有趣的特性是ANSI C引号字符串可以将'
(单引号)转义为\'
,而'…'
(常规单引号字符串)不能:
支持的转义序列列表:
反斜杠转义序列(如果存在)解码如下:
\a
警钟
\b
退格
\e
\E
转义字符(非ANSI C)
\f
饲料
\n
新线
\r
回车
\t
水平标签
\五
垂直选项卡
\
反斜杠
\"
单引号
\"
双引号
\nnn
八位字符,其值为八进制值nnn(一到三位)
\xHH
值为十六进制值HH(一个或两个十六进制数字)的八位字符
\嗯
Unicode(ISO/IEC 10646)字符,其值为十六进制值hhh(一到四个十六进制数字)
\嗯
Unicode(ISO/IEC 10646)字符,其值为十六进制值hhhh(一到八个十六进制数字)
\cx
控制x字符
扩展后的结果是单引号,就好像美元符号不存在一样
[1] 但是,您可以在“…”和“…”字符串中嵌入实际换行符;也就是说,您可以定义跨多行的字符串。ANSI C引号字符串是一个关键点。多亏了@mklement0 可以使用命令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
您可以通过输出清楚地了解其含义。问题:
如果s=$'\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
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
first second
third forth
fifth
这与变量无关。$'FOO'
(不同于此问题所涉及的$FOO
)是一个字符串文字。如果执行echo$'VAR'
,您将看到它打印字符串VAR
,而不是test
。不完全如此--\n
只是一个(转义的)字母n。'\n'
和“\n”
后面紧跟着n,这是对的。请注意,$'\n'
是特定于bash的,它在POSIX shell中不起作用(/bin/sh
)。要以兼容POSIX的方式获得相同的效果,您可以键入IFS='
,然后单击return以键入实际的换行符,然后键入结束符'