我使用bash脚本为程序生成输入文件。BASH脚本生成随机数的列表,然后写入输入文件。我的bash脚本有两个部分,其中第一部分生成随机数列表,第二部分使用随机数来构建输出文件内容。
# 1- Generate Random Numbers
for i in {1..200}
do
ARRAY+=($((RANDOM%885+0)))
done
echo "
${ARRAY[*]}
"> random_numbers.txt
# 2- construction of output file
echo "
# Packmol input file
filetype pdb
output peg_$(($npeg)).pdb
# selecting the structure according random number
structure peg${ARRAY[0]}.pdb
number 1
inside cube -$d. -$d. -$d. $d.
end structure
structure peg${ARRAY[1]}.pdb
number 1
inside cube -$d. -$d. -$d. $d.
end structure
structure peg${ARRAY[2]}.pdb
number 1
inside cube -$d. -$d. -$d. $d.
end structure
structure peg${ARRAY[3]}.pdb
number 1
inside cube -$d. -$d. -$d. $d.
end structure
structure peg${ARRAY[4]}.pdb
number 1
inside cube -$d. -$d. -$d. $d.
end structure
continued *****
structure peg${ARRAY[24]}.pdb
number 1
inside cube -$d. -$d. -$d. $d.
end structure
"> output.inp
如果我可以通过更改数组编号在下面给出的重复行上运行不同范围(25、50、75 ...)的循环(25、50、75 ...),是否有办法?
structure peg${ARRAY[*]}.pdb
number 1
inside cube -$d. -$d. -$d. $d.
end structure
{
# write header
printf '%sn' '# Packmol input file' 'filetype pdb' "output peg_$((npeg)).pdb"
# iterate over array contents
for value in "${ARRAY[@]}"; do
printf '%sn'
"structure peg${value}"
' number 1'
' inside cube -$d. -$d. -$d. $d.'
'end structure'
done
} >output.inp
...要仅采用每25个项目,请按以下方式修改内部循环:
# iterate over array contents
for ((i=0; i<${#ARRAY[@]}; i+=25)); do
printf '%sn'
"structure peg${ARRAY[$i]}"
' number 1'
' inside cube -$d. -$d. -$d. $d.'
'end structure'
done
注意:
- 对于整个块,我们只进行重定向。将
>>output.inp
放在一堆单独的命令上,每次重新打开文件,使其非常低效。 -
{start..end..count}
语法是非常限制的(不能使用变量),因此循环语法的C风格是强烈的。