![如何加入命令替换的结果?](https://linux22.com/image/158752/%E5%A6%82%E4%BD%95%E5%8A%A0%E5%85%A5%E5%91%BD%E4%BB%A4%E6%9B%BF%E6%8D%A2%E7%9A%84%E7%BB%93%E6%9E%9C%EF%BC%9F.png)
我想创建一个 mp3 文件列表,例如a 1.mp3|a 2.mp3
.
我尝试过echo ${(j:|:)$(echo *.mp3)}
它的一些变体,但它们不起作用:
# too much splitting
01|The|Magic|Finger|01.mp3|02|The|Magic|Finger|02.mp3|03|The|Magic|Finger|03.mp3|04|The|Magic|Finger|04.mp3|05|The|Magic|Finger|05.mp3|06|The|Magic|Finger|06.mp3
# too much quoting
01 The Magic Finger 01.mp3 02 The Magic Finger 02.mp3 03 The Magic Finger 03.mp3 04 The Magic Finger 04.mp3 05 The Magic Finger 05.mp3 06 The Magic Finger 06.mp3
我不想创建函数或变量来执行此操作。 (这可以简单地完成。)
答案1
获取 mp3 文件列表,将它们传递给它,echo
以便它可以用空格分隔打印它们,然后通过管道传输输出,读取它,在空格/制表符/换行符/NUL 上分割,然后用|
.
要么做:
printf '%s|' *.mp3
或者
files=(*.mp3)
joined=${(j:|:)files}
如果目的是将其用作模式zsh
,您可能需要转义这些文件名称中的通配符。这是通过b
参数扩展标志完成的:
pattern="(${(j:|:)${(b@)files}})"
答案2
您可以使用set
将这些文件放入位置参数中,然后"$*"
使用所需的字段分隔符扩展它们:
set -- *.mp3
(IFS=\|; echo "$*")
请注意,这是在子 shell 中完成的,因此对 IFS 的更改不会影响您当前的 shell。
答案3
我找到了一种方法来做到这一点,但对于这样一个简单的用例来说,它仍然相当复杂:
echo ${(j:|:)"${(@f)$(print -l *.mp3)}"}