gpt4 book ai didi

for-loop - 如何避免在 zsh for 循环中使用空格作为分隔符?

转载 作者:行者123 更新时间:2023-12-03 23:31:36 25 4
gpt4 key购买 nike

我正在尝试制作一个小脚本来转换音乐库中的一些文件。

但如果我做类似的事情:

#!/usr/bin/zsh                                                                     

for x in $(find -name "*.m4a");
do
echo $x;
done

在包含以下内容的文件夹中进行解释时:
foo\ bar.m4a

它会返回:
foo
bar.m4a

如何防止 for 循环将空格字符解释为分隔符?

我可以替换 $(find -name "*.m4a")$(find -name "*.m4a" | sed "s/ /_/g")然后使用 sed循环内的另一种方式,但是如果文件名/路径已经包含下划线(或我可以使用的其他字符代替下划线)怎么办?

任何的想法?

最佳答案

您可以通过双引号来防止命令替换的分词:

#!/usr/bin/zsh                                                                     

for x in "$(find -name "*.m4a")"
do
echo "$x"
done

请注意,命令替换中的双引号与其外部的双引号不冲突(实际上我以前从未注意到这一点)。如果你觉得单引号更易读,你可以很容易地使用单引号,如 "$(find -name '*.m4a')" .我通常在 find 中使用单引号初选。

出于同样的原因,在循环体内引用也很重要。它将确保 x 的值作为单个参数传递。

但这绝对是一个混合的、弗兰肯斯坦式的解决方案。您最好使用 globbing或使用 find如下:
find . -name '*.mp3' -exec echo {} \;

但这种形式是有限制的。您可以添加其他 -exec primaries,将像 shell 命令一样执行,由 && 分隔,但你不能从一个 -exec 管道到另一个,您不能与 shell 交互(例如,通过分配或扩展参数)。

关于for-loop - 如何避免在 zsh for 循环中使用空格作为分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33061510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com