如何将数组元素插入到zsh命令的位置参数中?

如何将数组元素插入到zsh命令的位置参数中?

我需要列出所有具有特定扩展名的文件,这些文件我只能在运行时知道,例如在特定文件中。或者扩展名存储在变量中。

我想使用fd命令来列出它们。列出具有多个扩展名的所有文件的命令类似于fd -e java -e c ....

我尝试了两种方法来管理它,但它们看起来都很丑。

!/bin/zsh
str="c java"
extensions=(${=str})
arguments=(" -e "${^extensions})
# Why `arguments=" -e "${^extensions};echo $arguments` output  -e c java
fd ${=arguments}
!/bin/zsh
str="c java"
extensions=(${=str})
option=(" -e ")
arguments=${option:^^extensions}
fd ${=arguments}

我希望有一个像这样的一行代码fd ${=${(" -e "):^^(${=str})}}

我还有一个问题:在第一个代码块中,为什么arguments=" -e "${^extensions};echo $arguments输出“-ec java\n”而arguments=(" -e "${^extensions}); echo $arguments输出“-ec -e java\n”?

答案1

Split str,然后添加-e到每个数组元素之前,然后再次拆分。

% str="c java"
% print -lr -- ${=${${=str}/#/-e }}
-e
c
-e
java

它比需要的更丑陋和更脆弱,因为第一步是将字符串拆分为列表。如果您将列表放在数组中,则可以只在前面添加然后拆分:

% a=(c java)
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java

然而,虽然分割IFS很短,但它是不正确的,因为它会在包含空格的输入上中断(或者更常见的是在$IFS字符上中断)。

% a=(c java "with spaces")
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java
-e
with
spaces

我不认为存在带有参数扩展的正确单行代码。有一个丑陋的Pglob 限定符,您可以通过 glob 一个东西并替换另一个数组来利用它。

% a=(c java "with spaces")
% print -lr -- .(P\''-e'\'e\''reply=($a)'\')
-e
c
-e
java
-e
with spaces

str="c java"
extensions=(${=str})
# Why `arguments=" -e "${^extensions};echo $arguments` output  -e c java

因为你正在创建一个字符串。在字符串上下文中,该^标志不起作用。它的作用是创建单独的数组元素,但是当上下文不允许数组时,无法做到这一点。

相关内容