パラメータ拡張のワイルドカード

パラメータ拡張のワイルドカード

以下を含む引数として渡されたディレクトリセットからファイルを選択しようとしています。

${@/%/*}

ただし、空白のあるパスが破損し、引用パラメータの拡張によりファイル名の拡張が停止されるため、理想的ではありません。満足のいく解決策がありますか?

PS:これを行う必要があることを知っていますが、find -maxdepthパラメータ拡張とワイルドカードを混在させるのはなぜそれほど難しいのか疑問に思います。

ベストアンサー1

いつでも次のことができます。

IFS=              # don't split
files=(${@/%/*})  # use split+glob upon expansion with split disabled

ただし、"$@"ワイルドカード文字が含まれている場合は、ワイルドカード文字として解釈されます。さらに、一致しないすべてのグロブに対して拡張されていないパターンが生成されます。

nullglobループとオプションを使用すると、次の問題を解決できます。

shopt -s nullglob
files=()
for arg do files+=("$arg"*); done

zsh代わりに、次のものを使用できますbash

files=($^argv*(N))

$^arrayrcexpandparam拡張オプションを開きます$arrayrcシェル(およびシェルでもfish)では、$array*whereは$array2つの要素aを取得してb拡張するので、a*ここb*ではdoと同じですfiles=($argv[1]*(N) $argv[2]*(N)...)$argv[1]doと同じ$1、もう少し冗長です)。これはそれ自体でglobの動作を(N)有効にするglob修飾子です。nullglob

fishシェルでは次のようになります。

set files $argv*

asは引数で同様の動作をfish有効にし、同様に配列を拡張します。しかし、more thanと構文が完全に異なることに注意してください。nullglobsetrcfishbashzsh

これは、必要に応じて"$1"*グローバルに拡大するように設計されています。あなたが実際に...滴を意味するならば、"$2"*${@/%/*}"$1"/*"%2"/*引数として渡されたディレクトリのファイルセット提案は、上記のコードスニペットで、、${@/%/\/*}"$arg"/*使用する必要があることです$^argv/*(N)$argv*

おすすめ記事