Answers:
这$'...'在bash没有参数扩展,它是通过引入一种特殊的报价ksh93是扩大这些\n,\x0a,\12代码为换行符。zsh还加了\u000a。ksh93并且bash也有\cj同时zsh拥有\C-J。ksh93还支持类似的变体\x{a}。
的$是一个线索,这是某种形式的或膨胀。但在任何情况下,与其他形式的扩展的不同之处在于使用$(如$((1 + 1)),$param或$(cmd))的,它不是双引号或这里的文档内进行(echo "$'x'"输出$'x'在所有炮弹,虽然是每POSIX不详)及其扩展不受分裂+ glob,绝对比扩展运算符更接近报价运算符。
IFS=\n会将IFS设置为n(\被视为引号运算符),IFS="\n"或者IFS='\n'将IFS设置为两个字符反斜杠和n。
您还可以使用:
IFS='
'
要么
IFS="
"
要么
IFS=$'
'
要传递一个文字换行符,尽管它不太清晰(而且除了使用诸如set list在代码中vi是否$IFS包含其他空格字符之类的东西外,其他都看不到)。
IFS=:,IFS=':',IFS=":",IFS=$':'所有设置IFS以:这样也没关系,你使用。
$'...':由至少支持(具有变化)ksh93,zsh,bash,mksh,的busybox sh,FreeBSD的sh。ksh93并且bash还具有一种$"..."用于文本本地化的引号形式,尽管它很少使用,因为它难以携带和可靠地进行部署和使用。
在es与fish壳还可以使用\n引号以外拓展到新行。
有些工具(例如printf,echo或的某些实现)也awk可以\n自行扩展。例如,一个人可以做:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
输出换行符,但请注意:
IFS = $(printf'\ n')
无法使用,因为命令替换($(...))会删除所有结尾的换行符。但是,您可以使用:
eval "$(printf 'IFS="\n"')"
之所以有效,是因为输出的printf结尾是"字符而不是换行符。
为了完整起见,在rc外壳和派生类(如es或akanga)中,$'\n'确实是该\n变量的扩展(变量的名称是两个字符\和的序列n)。这些shell对变量名可以包含哪些字符没有限制,并且仅具有一种引号:'...'。
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc变量也都导出到环境,但是至少在的Unix变体中rc,对于变量名称(如)\n,环境变量版本采用一种编码形式:
; env | grep foo | sed -n l
__5cn=foo\001bar$
(0x5c是ASCII的字节值\;另请参见如何使用0x1字节作为分隔符对该数组变量进行编码)。
类似的字符串$'\n'已由ksh93POSIX标准引入,目前不属于POSIX标准。
它们允许使用大多数类似C的转义符,例如$'\u2345'和也支持的转义符echo。
请注意,如果您不喜欢(对于ksh93或bash)使用该转义方法,则仍可以使用:
IFS='
'
这是等效的,但较难阅读。
顺便说一句:此扩展名已经通过POSIX标准提交人,但是它计划在SUSv8上使用,该版本预计不会在2020年之前出现,因为我们首先需要努力解决目前的错误列表。
$'...'展开与的展开不同echo。它们更类似于的format参数printf。对于echo,在\0123for $'...'和printfformat中需要为0 ,\0123这是\012换行符,其后是乱码3。
$'...'规范仍在讨论中。当前提议的措词还有几个问题有待解决。
\uxxxx扩展的),并且看不到适合现有实现的解决方案。因此,它可能无法进入下一个POSIX版本。也许他们可以将\uxxxx扩展问题留在第8期,所以我们至少还可以保留$'\n'。
+1通常的非人类知识水平