Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash IFS=$'的确切含义是什么\n';?_Bash_Shell_Variables_Environment Variables_Ifs - Fatal编程技术网

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以键入实际的换行符,然后键入结束符
'