中かっこ拡張を使用すると、リストが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' *