2015-09-05 3 views
0

Вот мой код:Замена строки с новым, содержащим переменную

for num in {0001..1000}; do 

    cd ${num}_1000_solar 
    sed -i '827s/.*/ if(BigUni==1) fp910=fopen("biguni_${num}.dat","w");/' binary.c 
    gcc singl.c binary.c -lm 
    cd .. 
done 

СЕПГ команда записывает «{номер}» в файл вместо того, чтобы там соответствующее значение из цикла. Как заменить строку строкой + некоторой переменной?

Cheers!

+2

. Достаточно здравый подход - передать параметр 'gcc', например' gcc -DNUM = '$ num'', и отрегулировать строку 827 в файле C, чтобы вместо этого использовать константу NUM. Более здравый подход, по-прежнему предложенный @JonathanLeffler, должен передать этот параметр в качестве аргумента командной строки. – tripleee

ответ

2

Если ${num} должен интерпретироваться оболочкой, он должен быть заключен в двойные кавычки (или внешние кавычки), а не одинарные кавычки.

for num in {0001..1000} 
do 
    (
    cd ${num}_1000_solar 
    sed -i '827s/.*/ if (BigUni==1) fp910=fopen("biguni_'"${num}"'.dat","w");/' binary.c 
    gcc singl.c binary.c -lm 
    ) 
done 

Имея 1000 программ, где вы изменить имя файла в исходном коде и перекомпилировать (в a.out каждый раз) представляет собой злоупотребление C. Вы должны передать имя файла в качестве аргумента программы. Другими словами, упражнение необходимо только потому, что установка глубоко ошибочна.

Кроме того, как правило, я избегаю cd subdir, а затем по cd .. в сценариях, когда это возможно. Запустив подкоманду (( и ) в пересмотренном сценарии), процесс вызывающей оболочки не изменяется при любых изменениях каталога. В конечном счете, это более надежно.

+0

Благодарим вас за решение и комментарий. –

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