2015-07-18 4 views
0

У меня есть каталог R_0, в котором я сохранил файл R_0.py, который создает много файлов в текущем каталоге и записывает в него.Изменять числовой символ и запускать файл автоматически

Я хочу автоматически запустить этот файл py, создать другой каталог R_1, скопировать R_0.py в этот каталог и переименовать его R_1.py, но до запуска R_1.py мне нужно изменить некоторые числовые поля в нем. Как только это будет сделано, мне нужно снова повторить задачу (каталог R_2 с файлом R_2.py и т. Д.)

Мне нужно сделать это 20 раз, поэтому у меня есть 20 каталогов с именем R_1, R_2, ..., R_20.

Я никогда раньше не использовал оболочку сценария (я знаю только основные команды, такие как ls, cd, mv и несколько других), но я думаю, что лучший способ сделать это 20-шаговую задачу - написать один.

Предположим, у нас есть этот R_0.py исходный файл (на самом деле это более сложный, но я полагаю, что это не важно для решения проблемы):

dummy = 2 

Разница между всеми другими файлами ру в номер 2: в файле R_ $ {i} .py, мне нужно иметь dummy = expr(i), где expr (i) - это еще одно числовое значение, полученное путем выполнения некоторых арифметических операций над i, а не dummy = 2.

Я написал .sh файл bash языка сайта:

#!/bin/bash 
for i in $(seq 1 20) do 
    mkdir "/Users/usersos/Desktop/R_${i}" ; 
    cp "/Users/usersos/Desktop/R_0/R_0.py" "/Users/usersos/Desktop/R_${i}" ; 
    cd "/Users/usersos/Desktop/R_${i}" ; 
    mv R_0.py R_${i}.py ;   
    argument1=$((60000+150*i)) ; 
    sed 's/dummy = 2/dummy = ${argument1}/g' R_${i}.py ; 
    python R_${i}.py ; 
done 

Вопрос заключается в том, что моя команда sed не пишет правильные вещи: в моем R _ $ {I} .py файлы, которые я нашел dummy = ${argument1} вместо dummy = 60300 с i = 2, например.

Я искал через интернет и нашел инструмент awk, но у меня не получилось.

+1

использовать двойные кавычки вокруг сценария sed. переменные не будут расширяться в одинарных кавычках. – hek2mgl

+0

Я сделал это. Чтобы проверить файл '.sh', я упростил файл R_0.py. Теперь он читает: 'dummy = 0'. Я также изменил 'sed 's/myFunction (0,0)/myFunction ($ {argument1}, $ {argument2})/g' R _ $ {i} .py;' to 'sed 's/dummy = 0/dummy = $ {argument1}/g "R _ $ {i} .py'. В результате файлы не изменяются, но в оболочке python печатает dummy = 60150 и dummy = 60300. Я предпочел бы, чтобы это было напечатано в моих файлах! – dada

+0

Я меняю свой начальный пост в соответствии с изменениями в файле python. – dada

ответ

0

Правильный сценарий заключается в следующем:

#!/bin/bash 
for i in $(seq 1 20) do 
    mkdir "/Users/usersos/Desktop/R_${i}" ; 
    cp "/Users/usersos/Desktop/R_0/R_0.py" "/Users/usersos/Desktop/R_${i}" ; 
    cd "/Users/usersos/Desktop/R_${i}" ; 
    mv R_0.py R_${i}.py ; 
    argument1=$((60000+150*i)) ; 
    sed -i.bak "s/dummy = 2/dummy = ${argument1}/g" R_${i}.py ; 
    python R_${i}.py ; 
done 

Разница в команде sed. Я использовал -i.bak вместо -i, потому что я работаю на Mac. Это создает новый файл R_ $ {i} .py.bak. На linux я думаю, что достаточно положить -i.