$ find -name "Bik*"
./Biking
./Biking/Unsync/Biking.md.~6~
./Biking/Rendered/Biking.gen.html
./Biking/Biking.md
式を次の変数に置き換えると、次のようになります。
$ a='-name "Bik*"'
$ find $a
私は何の結果も得られません。なぜですか?そして何を修正する必要がありますか?
答え1
(対話型シェルとして使用しない限りzsh
...)問題は、二重引用符がパターンの一部と見なされることです。実際に実行するコマンドは次のとおりです。
find . -name '"Bik*"'
これは、シェルが引用符で囲まれていない文字列に対して単語分割を実行し、$a
文字列を2つの単語に-name
分割するためです"Bik*"
。その後、これらの単語はファイル名(「globbing」)を生成します。つまり、"Bik*"
現在のディレクトリは、その特定のパターン(二重引用符を含む)と一致するすべてのファイル名に展開されます。そのようなファイル名がある可能性はほとんどないため、パターンは拡張されていないまま、引用符もそのまま残ります。
使ってみた方a='-name Bik*'
はいらっしゃいます。働いたBik*
ただし、現在のディレクトリに一致するものがない場合にのみ適用されます。
でbash
使用すると、パターンが割り当てられていないため、shopt -s nullglob
両方の試行でエラーが発生します(シェルが一致しないパターンを削除します)。find
-name
zsh
(シェルではfind
どのオプションがあるかわからないため、エラーが発生します-name "Bie*"
。つまり、完全な文字列、はい。これはzsh
、デフォルトでは、シェルが引用しない拡張に対してこれらの分割およびグローバル操作を実行しないためです。 )
代わりに配列を含むシェルを使用している場合は、次を使用してください。
a=( -name 'Bik*' )
find . "${a[@]}"
find
ここに示すように使用すると、個々の単語が正しく引用されます。
または、次のものを使用できます。
a='Bik*'
find . -name "$a"
関連:
返品後半~の私のソリューション到着関数の内部に-fを設定してください。