我正在尝试编写一个函数,我称之为它escape
,其行为如下:
% IFS=$' \t\n\000'
% escape FOO $IFS
FOO=$' \t\n\000'
换句话说,escape
采用两个参数,然后将第一个参数作为变量名,它会打印出一行 a zsh源代码其中该名称的变量被分配一个$''
带引号的“规范print
转义”字符串,这样,在评估这行源代码时,第一个参数命名的变量将具有第二个参数作为其值。 (我确信这就像泥巴一样清晰,所以我将escape
在这篇文章的末尾给出更多关于应该如何表现的例子。)
这是该函数的不完整实现escape
:
escape () {
local varname=$1
local value="$2"
print -n "$varname=\$'"
# ???
print "'"
}
缺失的部分(由 表示???
)是 的内容$value
被“规范print
转义”的地方。限定词“规范”是必要的,因为有许多字符至少有几种表示形式可以print
将它们识别为。例如,也print
知道\n
as\012
和 as \C-J
。在本例中,\n
是规范形式。一般来说,标准转义序列\n
、\r
、\t
等是其对应字符的规范形式。可打印 ASCII 字符(例如A
、=
、 )的标准显示形式9
是规范的。对于其余字符,如果可以选择表示形式,我会选择八进制形式作为规范形式(至少直到\177
;我不确定如何$''
处理更高的代码),但这种偏好并不强。
当然,我并不希望看到“从头开始”实现此功能的代码。相反,我希望已经存在一个实用程序来执行从字节到print
转义文本表示的转换。
任何指示将不胜感激!
以下是一些escape
实际的例子(假设):
% escape HELLO $( echo 'hello world' )
HELLO=$'hello world\n'
% escape SUBSEP $( perl -e 'print $;' )
SUBSEP=$'\034'
% abc=$'\141\012\142\012\143\012'
% print -n $abc
a
b
c
% escape ABC $abc
ABC=$'a\nb\nc\n'
答案1
我想q
参数扩展标志,特别是qqqq
变体。
FOO=${(qqqq)IFS}
因此,您可以这样编写函数(使用标志P
来扩展名称为 的参数$2
):
escape () {
print -r -- "$1=${(Pqqqq)2}"
}