我知道如果$VAR
包含一些字符串,我可以将这个字符串拆分为句点,以生成一个数组,如下所示:
% VAR=$ZSH_VERSION
% parts=(${(s:.:)VAR})
% printf '%s\n' $parts
5
0
7
Run Code Online (Sandbox Code Playgroud)
我必须:
在(s::)
标志之间放什么才能将$VAR
at 字符的值与 ASCII 代码 0分开,比如说?
我已经尝试了所有我能想到的。例如
% VAR=$'5\0000\0007'
% parts=(${(s:\000:)VAR})
% printf '%s\n' $parts
5^@0^@7
Run Code Online (Sandbox Code Playgroud)
它都不起作用。
您需要使用p
flag 使其他扩展标志(如下p
)识别转义序列:
$ printf '%s\n' ${(ps:\0:)VAR}
5
0
7
Run Code Online (Sandbox Code Playgroud)
或使用速记:
printf '%s\n' ${(0)VAR}
Run Code Online (Sandbox Code Playgroud)
保留空元素:
printf '%s\n' "${(0@)VAR}"
Run Code Online (Sandbox Code Playgroud)
但是您不能将它用于输出find ... -print0
,因为它\0
在输出中添加了尾随,您将始终获得最后一个空元素。