使用通配符扩展 item={one,two,third}

使用通配符扩展 item={one,two,third}

如果我使用bash大括号扩展我会得到一个列表

echo item={one,two,three}
item=one item=two item=three

假设我所在的目录中包含与通配符匹配的文件/文件夹,是否有任何方法可以进行与这些文件/文件夹匹配的扩展?

ls
blue  green  red

echo item=*      # Obviously not
item=*

echo item={*}    # Maybe? ...but no
item={*}

在我的例子中,我希望扩展为item=blue item=green item=red

我得到的最好的就是这样的代码

items=()
for dirent in *; do items+=("item=$dirent"); done
echo "${items[@]}"

item=blue item=green item=red

答案1

您可以将当前目录的文件存储在数组中,如下所示:

items=(*)

然后可以使用参数扩展来添加前缀:

printf "%s\n" "${items[@]/#/item=}"

您可以使用它来更新数组:

items=("${items[@]/#/item=}")

答案2

zsh

items=(*)
print -rC1 item=$^items

或者:

(){ print -rC1 item=$^@; } *

或者:

(){ print -rC1 ${@/#/item=}; } *

或者:

print -rC1 ./*(:s:./:item=)

或者:

set -o histsubstpattern
print -rC1 *(:s/#/item=)

或者:

print -rC1 *(e['REPLY=item=$REPLY'])

或者:

printf '%s%s\n' *(P[item=])

或者:

items=()
printf -v items 'item=%s' *
print -rC1 -- $items

ETC。

对于所有这些,添加Nglob 限定符以获取无输出(或带有该输出的空行printf),而不是在没有匹配文件时出现错误(此处为*,表示当前目录不可读或仅包含隐藏文件) 。

当然,如果只是打印它们,那么你可以这样做(在任何 shell 中):

printf 'item=%s\n' *

相关内容