Yan*_*ard 117 variables bash shell environment-variables ifs
如果以下示例将IFS环境变量设置为换行符...
IFS=$'\n'
Run Code Online (Sandbox Code Playgroud)
我知道IFS环境变量是什么,\n字符是什么(换行),但为什么不使用以下形式:(
IFS="\n"哪个不起作用)?
例如,如果我想循环遍历文件的每一行并想要使用for循环,我可以这样做:
for line in (< /path/to/file); do
echo "Line: $line"
done
Run Code Online (Sandbox Code Playgroud)
但是,除非IFS设置为换行符,否则这将无法正常工作.为了让它工作,我必须这样做:
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
Run Code Online (Sandbox Code Playgroud)
注意:我不需要另一种方式做同样的事情,我已经知道很多其他的...我只是对此感到好奇,$'\n'并想知道是否有人可以给我一个解释.
sep*_*p2k 156
通常bash不会解释字符串文字中的转义序列.所以,如果你写\n或"\n"或'\n',这不是一个换行符-这是字母n(在第一种情况下)或反斜杠后跟字母n(在另外两起案件).
$'somestring'是带有转义序列的字符串文字的语法.所以不像'\n',$'\n'实际上是一个换行符.
mkl*_*nt0 18
只是为了给构造提供正式名称:表单的字符串$'...'称为ANSI C引用的字符串.
也就是说,与[ANSI] C字符串一样,反冲时转义序列被识别并扩展到它们的文字等价物(请参阅下面的支持转义序列的完整列表).
之后这种扩张,$'...'字符串的行为方式相同'...'字符串 -也就是说,它们会被视为文字不受任何[其它] shell扩展.
例如,$'\n'扩展到面值换行符-这是一件好事一个普通的bash字符串字面量(是否'...'或者"...")不能做.[1]
另一个有趣的特性是ANSI C引用的字符串可以转义为'(单引号)\','...'(常规单引号字符串)不能:
echo $'Honey, I\'m home' # OK; this cannot be done with '...'
Run Code Online (Sandbox Code Playgroud)
支持的转义序列列表:
反斜杠转义序列(如果存在)按如下方式解码:
警报(铃声)
\ b退格
\ e\E转义字符(不是ANSI C)
\ f表格饲料
\n换行
\ r \n回车
\ t水平标签
\ v垂直标签
\反斜杠
单引号
"双引号
\nnn八位字符,其值为八进制值nnn(一到三位数)
\ xHH八位字符,其值为十六进制值HH(一个或两个十六进制数字)
\ uHHHH Unicode(ISO/IEC 10646)字符,其值为十六进制值HHHH(一到四个十六进制数字)
\ UHHHHHHHH Unicode(ISO/IEC 10646)字符,其值为十六进制值HHHHHHHH(一到八个十六进制数字)
\ cx是control-x字符
扩展结果是单引号,好像美元符号不存在一样.
[1]但是,您可以在"..."和"..."字符串中嵌入实际换行符; 即,您可以定义跨越多行的字符串.
Bra*_*ger 16
来自http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html:
"$'STRING'"形式的单词以特殊方式处理.单词扩展为一个字符串,反斜杠转义字符被ANSI-C标准指定替换.反斜杠转义序列可以在Bash documentation.found中找到
我想这是迫使脚本逃避换行符到正确的ANSI-C标准.
小智 8
重新恢复默认IFS-这OLDIFS=$IFS不是必需的.在子shell中运行新的IFS以避免覆盖默认的IFS:
ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )
Run Code Online (Sandbox Code Playgroud)
此外,我真的不相信你完全恢复旧的IFS.你应该加倍引用它以避免破线等OLDIFS="$IFS".