代替変数文字列をパターンとして使用するcksumファイル

代替変数文字列をパターンとして使用するcksumファイル

以下の例ではこれを回避できますかeval?それとも別の方法はありませんか?変数のファイルリストは動的であり、すべてのファイルの合計を計算したいと思います。このディレクトリには他の多くのファイルがありますが、無視する必要があります。

$ Z="file1 file4"
$ echo ${Z//\ /,}
file1,file4
$ echo {${Z//\ /,}}
{file1,file4}
$ cksum {file1,file4}
927007485 136284 file1
2748059092 136286 file4
$ cksum {${Z//\ /,}}
cksum: {file1,file4}: No such file or directory
$ eval cksum {${Z//\ /,}}
927007485 136284 file1
2748059092 136286 file4

答え1

文字列の代わりに配列を使用してください。

files=( file1 file2 "filename with spaces" file50 "*my* file" )

cksum "${files[@]}"

上記の各二重引用符は、特にファイル名にスペースまたはファイル名のワイルドカード文字が含まれている場合に重要です。

答え2

cksum {${Z//\ /,}}期待どおりに機能しない理由を説明してください。

  1. バッシュによると交換/拡張順序、支柱の拡張が発生します。今後パラメータの置換
  2. しかし、文書化されています「パラメータ拡張との競合を避けるために、文字列 '${'は中括弧拡張に適しているとは見なされません。 - したがって、bashはここで中括弧拡張を行いません。
  3. その後、シェルは最後にパラメータ置換を実行し、コマンドは次に展開されます。cksum {file1,file4}
  4. シェルは戻って拡張リストを再実行しないため、中かっこ拡張を再実行しません。 「{file1,file4}」という単語は 1 つだけ残ります。
  5. そしてそのような文書もありません。

ミックスインの導入時にeval拡張リストを再確認するようにシェルに明示的に要求します。コマンドで中括弧拡張を実行し、cksum {file1,file4}2 つのファイルのチェックサムを取得できます。

関連情報