0

単純なbashforループがあり、その中でコマンドを実行しようとしています。ループは、さまざまなファイル名を実行できるようにするためのものです。

ファイルは次のとおりです。

crystal0_cmin.pdb
crystal1_cmin.pdb
.
. 
.

ループは次のとおりです。

for ((i=0;i<=10;i++))
do
cp Files/crystal$i_cmin.pdb Energy/
cp Files/crystal$i_cmin.psf Energy/
done

問題は、常に次のエラーメッセージが表示されることです。

cp: cannot stat `Files/crystal.pdb': No such file or directory
cp: cannot stat `Files/crystal.psf': No such file or directory

ただし、crystal.pdbファイルとcrystal.psfファイルを指定することはありません。すべてのiの$i拡張子を無視するだけです。つまり、どのファイルもコピーされません。

誰かが私がこれを修正する方法を知っていますか?

ありがとう!

4

2 に答える 2

5

問題は、bash が$i_cmin変数として解釈していることです。これを修正するには、中かっこを使用して、bash が$i変数であり、そのように解釈する必要があることを伝えます。

cp Files/crystal${i}_cmin.pdb Energy/
cp Files/crystal${i}_cmin.psf Energy/
于 2012-09-14T20:47:02.717 に答える
2

即時の修正は、Adam が提案したように中括弧を使用して、パラメーター名をi次のように制限することです。

for ((i=0; i<=10; i++)); do
    cp Files/crystal${i}_cmin.pdb Energy/
    cp Files/crystal${i}_cmin.psf Energy/
done

次のステップは、生成されたファイル名を反復処理するために C スタイルの for ループを使用する必要がないことを理解することです。ブレース展開を使用して、目的のファイルを直接反復処理できます (これは、ループとウィリアムのコメントの中間点です:

for f in Files/crystal{0..10}_cmin.p{db,sf}; do
    cp "$f" Energy/
done

最後のステップは、 for ループがまったく必要ないことを認識することです。ブレース展開によって生成されたファイルのリストは、cp直接渡されるファイル リストとして使用できるためです (William のコメント)。

cp Files/crystal{0..10}_cmin.p{db,sf} Energy/
于 2012-09-14T21:08:08.440 に答える