关于bash:IFS = $’的确切含义是什么?

What is the exact meaning of IFS=$'
'?

如果下面的示例将IFS环境变量设置为换行符…

1
2
IFS=$'
'
  • 美元符号是什么意思准确吗?
  • 它在这个特定的地方做什么案例?
  • 在哪里可以阅读更多关于这个特定用法的信息(谷歌不允许在搜索中使用特殊字符,我也不知道在其他情况下要查找什么)?

我知道IFS环境变量是什么,
字符是什么(换行),但是为什么不使用下面的形式呢?IFS="
"
(哪个不起作用)?

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

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

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

1
2
3
4
5
6
7
OLDIFS=$IFS
IFS=$'
'

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

注意:我不需要另一种方法来做同样的事情,我已经知道很多其他方法…我只对那件事很好奇,想知道是否有人能给我一个解释。


bash通常不在字符串转义序列literals艺术家。所以,如果你写
"
"
'
'
,这不是一个实现它的字母n(第一例)或一个反斜杠后跟的n(另两例)。

$'somestring'是一个语法的字符串转义序列literals与。这是一个不同的'
'
$'
'
真的实现了。


只是给它的正式名称:字符串构造的形式$'...'是带引号的字符串为ANSI C。

这是[ C ],如ANSI字符串转义序列间隙是公认的和扩展的文本等效(湖的完整列表支持下面的转义序列)。

这个男孩的行为$'...'扩展字符串,字符串是相同的方式'...'IU,他们不受任何处理作为literals [继续]外壳扩展。

例如,一个$'
'
expands字面换行字符的字符串是一个正则bash的东西(无论文字或"..."'...'[ 1 ])不能做的。

另一个有趣的特征是ANSI C CAN转义引号(单引号)\''AS,其中,'...'(正则单引号)不能:

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

列表支持的转义序列:

Backslash escape sequences, if present, are decoded as follows:

\a
alert (bell)

\b
backspace

\e
\E
an escape character (not ANSI C)

\f
form feed

newline

carriage return

\t
horizontal tab

\v
vertical tab

\
backslash

\'
single quote

\"
double quote

nn
the eight-bit character whose value is the octal value nnn (one to three digits)

\xHH
the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)

\uHHHH
the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)

\UHHHHHHHH
the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

\cx
a control-x character

The expanded result is single-quoted, as if the dollar sign had not been present.

[ 1 ],你可以,但是,在实际的嵌入式newlines……"和"……"的字符串的字符串定义,IU,那你可以跨多行。


从http:/ / / / _ www.linuxtopia.org在线指南bash手册_ _ for _初学者/教派:_ 03.html _ 03

Words in the form"$'STRING'" are
treated in a special way. The word
expands to a string, with
backslash-escaped characters replaced
as specified by the ANSI-C standard.
Backslash escape sequences can be
found in the Bash documentation.found

我想它在六月的脚本到换行转义到适当的ANSI C标准。


重新恢复默认IFS这OLDIFS=$IFS是不必要的。为了避免在运行新的IFS的壳层overriding默认IFS:

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

此外,我不相信你真的完全恢复旧的IFS。你应该避免它的双率如OLDIFS="$IFS"破线。


ANSI C字符串是一个关键点。mklement0感谢"。

你可以测试一个ANSI C OD带引号的字符串命令。

1
2
3
4
5
6
7
8
echo -n $'
'
| od -c
echo -n '
'
| od -c
echo -n $"
"
| od -c
echo -n"
"
| od -c

输出:

1
2
3
4
5
6
7
8
9
10
11
12
0000000  
 
0000001

0000000   \   n  
0000002

0000000   \   n  
0000002

0000000   \   n  
0000002

你可以很清楚的知道意义的输出。


它就像从一个变量的值查询

1
2
3
VAR='test'
echo VAR
echo $VAR

是不同的,所以在美元上evaluates登录的内容。