以下の例ではこれを回避できますか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//\ /,}}
期待どおりに機能しない理由を説明してください。
- バッシュによると交換/拡張順序、支柱の拡張が発生します。今後パラメータの置換
- しかし、文書化されています「パラメータ拡張との競合を避けるために、文字列 '${'は中括弧拡張に適しているとは見なされません。 - したがって、bashはここで中括弧拡張を行いません。
- その後、シェルは最後にパラメータ置換を実行し、コマンドは次に展開されます。
cksum {file1,file4}
- シェルは戻って拡張リストを再実行しないため、中かっこ拡張を再実行しません。 「{file1,file4}」という単語は 1 つだけ残ります。
- そしてそのような文書もありません。
ミックスインの導入時にeval
拡張リストを再確認するようにシェルに明示的に要求します。今コマンドで中括弧拡張を実行し、cksum {file1,file4}
2 つのファイルのチェックサムを取得できます。