2015-05-13 4 views
0

Я использовал скрипт bash для создания входных файлов для программы. Сценарий bash генерирует список случайных чисел, за которыми следует запись входного файла. У моего сценария bash есть два раздела, где первый раздел генерирует список случайных чисел, а второй раздел использует случайное число для создания содержимого выходного файла.Напишите цикл внутри эха bash-script

# 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

FYI, было бы лучше использовать символы нижнего регистра для имен переменных; имена всех прописных букв обычно зарезервированы для переменных среды и встроенных. –

+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-стиля для цикла является более предпочтительным.
+0

IMPO он бы лучше прочитал, чтобы использовать функции интерполяции printf. * shrug * – kojiro

+0

@kojiro, * shrug *, действительно. Строка формата ''% s \ n'' позволяет меньше отдельных 'printf' -зазвовок, поэтому я предпочитаю ее здесь. –

+0

Когда я пишу цикл внутри эха, он просто распечатывается как; для idx в 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99; do printf '% s \ n' структура peg5 номер 1 'внутри куба -300. -300. -300. 300.» done –

Смежные вопросы