'IFS = $'\ n'中的'\ n'是变量吗?


12

我注意到设置换行符IFS应该以$作为前缀

IFS=$'\n'

但是如果设置一个冒号,

IFS=:

\n变量吗?

Answers:


21

$'...'bash没有参数扩展,它是通过引入一种特殊的报价ksh93是扩大这些\n\x0a\12代码为换行符。zsh还加了\u000aksh93并且bash也有\cj同时zsh拥有\C-Jksh93还支持类似的变体\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以:这样也没关系,你使用。

$'...':由至少支持(具有变化)ksh93zshbashmksh,的busybox sh,FreeBSD的shksh93并且bash还具有一种$"..."用于文本本地化的引号形式,尽管它很少使用,因为它难以携带和可靠地进行部署和使用。

esfish壳还可以使用\n引号以外拓展到新行。

有些工具(例如printfecho或的某些实现)也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外壳和派生类(如esakanga)中,$'\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字节作为分隔符对该数组变量进行编码)。


1
+1通常的非人类知识水平
史蒂文·彭妮


6

类似的字符串$'\n'已由ksh93POSIX标准引入,目前不属于POSIX标准。

它们允许使用大多数类似C的转义符,例如$'\u2345'和也支持的转义符echo

请注意,如果您不喜欢(对于ksh93或bash)使用该转义方法,则仍可以使用:

IFS='
'

这是等效的,但较难阅读。

顺便说一句:此扩展名已经通过POSIX标准提交人,但是它计划在SUSv8上使用,该版本预计不会在2020年之前出现,因为我们首先需要努力解决目前的错误列表。


$'...'展开与的展开不同echo。它们更类似于的format参数printf。对于echo,在\0123for $'...'printfformat中需要为0 ,\0123这是\012换行符,其后是乱码3。
StéphaneChazelas 18年

1
注意,该$'...'规范仍在讨论中。当前提议的措词还有几个问题有待解决。
斯特凡Chazelas

IIRC,它已关闭,但已重新打开。由于事实上还有很多时间才可以生效,因此我认为并没有真正的问题。
schily

1
它关闭了,我提出了几个异议,然后重新打开,然后进行了修改,仍然存在几个问题(其中大多数是关于\uxxxx扩展的),并且看不到适合现有实现的解决方案。因此,它可能无法进入下一个POSIX版本。也许他们可以将\uxxxx扩展问题留在第8期,所以我们至少还可以保留$'\n'
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.