在echobash脚本中编写一个循环

在echobash脚本中编写一个循环,bash,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- con

我使用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
…要仅获取每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循环语法非常可取。
仅供参考,最好在变量名中使用小写字符;所有大写名称通常都是为环境变量和内置项保留的。您是否有理由希望在echo中构造循环,而不是分解echo,并将其部分放入循环中?实际上使用printf的插值功能会更好。shrug@kojiro,耸耸肩,真的。“%s\n”的格式字符串允许较少的单独printf调用,这就是我喜欢在这里使用它的原因;对于01 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 22 22 23 24 26 27 28 30 31 32 33 34 36 37 39 40 41 42 43 44 45 46 47 48 50 51 53 55 56 58 59 60 61 62 64 64 66 67 69 70 71 72 74 75 77 78 80 82 84 85 87 89 91 92 94 96 98 99中的idx;在多维数据集-300中打印“%s\n”结构peg5编号1-300. -300300.' done@MuhammadSajidIqbal,如果你看我在这里演示的内容,它不会在回音中嵌入一个循环;相反,它在循环内调用echo,Cyrus的实现也是如此。如果您打算对建议的实施方案发表意见,请实际尝试遵循其建议:@MuhammadSajidIqbal,…顺便说一句,我已经编辑添加了一个使用C样式for循环的变体。尽管如此,在方法上的较大差异是将回音嵌入到回音支架中,而不是将回音支架中的回音嵌入到回音支架中。
  # 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