ワイルドカードを使用して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

など。

これらすべてに一致するファイルがない場合(ここでは現在のディレクトリを読み取ることができない、または隠されたファイルのみを含むことを意味します)、エラーの代わりに出力を取得しないように(Nまたはその出力を含む空行)、glob修飾子を追加します。printf*

もちろん、単に印刷する場合は、次のようにすることができます(すべてのシェルから):

printf 'item=%s\n' *

関連情報