在echo bash-script中写一个循环

时间:2015-05-13 20:17:36

标签: bash

我使用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 ...)的循环,是否有办法?

structure peg${ARRAY[*]}.pdb
  number 1
  inside cube -$d. -$d. -$d. $d.
end structure

1 个答案:

答案 0 :(得分:0)

{
  # write header
  printf '%s\n' '# Packmol input file' 'filetype pdb' "output peg_$((npeg)).pdb"

  # iterate over array contents
  for value in "${ARRAY[@]}"; do
    printf '%s\n' \
      "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 '%s\n' \
      "structure peg${ARRAY[$i]}" \
      '  number 1' \
      '  inside cube -$d. -$d. -$d. $d.' \
      'end structure'
  done

注意事项:

  • 我们只对整个块进行重定向一次。将>>output.inp放在一堆单独的命令上每次重新打开一次文件,使其效率非常低。
  • {start..end..count}语法是非常有限的(不能使用变量),所以C语言for循环语法是非常可取的。