1

「検索」コマンドを動的に作成して、何かが返されるかどうかを確認したいと思います。

これは最小化された例です。ファイルを含むディレクトリで、

find . -name '*'

もちろんファイルを返します。だが

VAR="find . -name '*'"
$VAR

何も返しません。引用符の解釈の問題のように見えます。しかし、なぜ?

(実際には、特定のプレフィックスを持つファイルが存在するかどうかを確認したいので、を使用し-name '${MYPREFIX}*'、内の出力をキャプチャして$()、結果の文字列が空かどうかをテストするつもりでした。)

これが些細なことである場合はお詫び申し上げます。私は答えを見つけるために時間を費やしましたが、私が見つけたすべてのケースはどういうわけか異なっていました。通常、問題は、findコマンドでワイルドカードを実行する必要があるときにシェルがワイルドカードを展開することです。ここで、シェルは時期尚早の拡張を行いませんが、findも文字通りの引用符を受け取るためか、findも行いません。洞察をありがとう。

4

2 に答える 2

2
eval $VAR

は、の値を引数付きのコマンドとしてeval再解釈します。$VAR

注意してください:evalこれは強力ですが危険なメカニズムです。

于 2012-05-09T03:05:20.563 に答える
1

eval可能な限り使用しないことをお勧めします。この場合、コマンドを実行する前にコマンドを変数に格納する必要がある場合は、配列を使用してから次のように呼び出すことをお勧めします"${cmd_array[@]}"

var=(find . -name "${prefix}*")  # This stores the elements of the command as an array
result=$("${var[@]}")  # This executes the command and stores its output in $result

find コマンドを動的に構築することもできることに注意してください。

patterns=()  # start with an empty list of patterns
for prefix in $prefix_list; do
    patterns+=(-o -name "${prefix}*")  # add each prefix to a list of find patterns
done
patterns=("${patterns[@]:1}") # Use array slicing to remove the first "-o"
result=$(find . "${patterns[@]}")

使い方によっては、find コマンドを bash 関数でラップすることも役立つ場合があります。

find_prefix() {
    find . -name "${1}*"
}
result=$(find_prefix "$prefix")
于 2012-05-09T03:52:45.877 に答える