如果我使用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。
对于所有这些,添加N
glob 限定符以获取无输出(或带有该输出的空行printf
),而不是在没有匹配文件时出现错误(此处为*
,表示当前目录不可读或仅包含隐藏文件) 。
当然,如果只是打印它们,那么你可以这样做(在任何 shell 中):
printf 'item=%s\n' *