0

我有一个简单的 bash for 循环,并试图在其中执行一个命令。循环是这样我可以执行不同的文件名。

这些文件是:

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直接传递给的文件列表(威廉的评论):

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