![使用空字符作为分隔符连接作为参数传递的字符串](https://linux22.com/image/156614/%E4%BD%BF%E7%94%A8%E7%A9%BA%E5%AD%97%E7%AC%A6%E4%BD%9C%E4%B8%BA%E5%88%86%E9%9A%94%E7%AC%A6%E8%BF%9E%E6%8E%A5%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我正在寻找一个 CLI 工具,它接受任意数量的参数 $a、$b、$c、$d 等,并写入$a"\0"$b"\0"$c"\0"$d
标准输出。是否有一个标准工具可以做到这一点,我可以在 CLI 上的管道的开头使用它?我的实现echo
似乎不允许自定义分隔符。
答案1
printf
可以解决这个问题,几乎:
printf "%s\0" "$a" "$b" "$c" ...
printf
根据需要重复其格式字符串,在本例中每个参数重复一次,因此最终会得到每个参数后跟一个空字节。
要删除最后一个空字节,请使用 GNU head
:
printf "%s\0" "$a" "$b" "$c" ... | head -c-1
Zsh 的内置函数print
也可以做到这一点,无需后期处理:
print -rNn "$a" "$b" "$c" ...
(-r
禁用转义处理,-N
打印由空字节分隔和终止的参数,-n
禁用终端换行符。谢谢钢铁起子给小费!)
答案2
该printf
命令将根据需要重复该格式,因此我们可以这样做
print "%s\0"
我们可以看到它的实际效果:
$ printf "%s\0" hello there | hdump -8
00000000 68 65 6C 6C 6F 00 74 68 hello.th
00000008 65 72 65 00 ere.
$ printf "%s\0" hello there everyone out there | hdump -8
00000000 68 65 6C 6C 6F 00 74 68 hello.th
00000008 65 72 65 00 65 76 65 72 ere.ever
00000010 79 6F 6E 65 00 6F 75 74 yone.out
00000018 00 74 68 65 72 65 00 .there.
请注意,它还会在字符串末尾放置一个终结符 NUL。如果您不希望这样,我们可以将其删除,例如sed 's/.$//'
$ printf "%s\0" hello there everyone out there | sed 's/.$//' | hdump -8
00000000 68 65 6C 6C 6F 00 74 68 hello.th
00000008 65 72 65 00 65 76 65 72 ere.ever
00000010 79 6F 6E 65 00 6F 75 74 yone.out
00000018 00 74 68 65 72 65 .there