特定の場所で変数の値を変更し、それをコンパイルして一連の数値に対して複数回実行したいC ++スクリプトがあります。私のシェルスクリプトは次のとおりです。
#!/bin/bash
Rpl_array="30 60 90 120 150 180 210 240 270 300 330 360 390 420 450 480 510 540 570 600 630 660 690 720 750 780 810 840 870 900 930 960 1000"
parent_directory="execs_convergence_testing_corrected_robin_condition/phi_0/"
for rpl in ${Rpl_array}; do
sed -ie "s/R_pl_initial=30.0/R_pl_initial="${rpl}"/g" iron_ablation_phi_nonzero_checking.cpp
sed -ie "s/Rpl_30/Rpl_"${rpl}"/g" iron_ablation_phi_nonzero_checking.cpp
g++ -std=c++0x iron_ablation_phi_nonzero_checking.cpp -o ${parent_directory}/Rpl_${rpl}.exe
done
ご覧のとおり、変数のsed
値を最初に変更してから、文字列を変更しようとして2回使用しています。次に変更をコンパイルし、rplのすべての値を実行します。しかし、このコードは私には適していません。何が間違っているのか疑問に思います。
答え1
スクリプトを書いた方法でデフォルトのC ++ソースファイルを変更しました。したがって、最初の実行では30.0を30に置き換え、2番目の実行では置き換えるsed
内容を見つけることができません。 ..
以下が機能します(引用の問題も解決しました)。
#!/bin/bash
Rpl_array="30 60 90 120 150 180 210 240 270 300 330 360 390 420 450 480 510 540 570 600 630 660 690 720 750 780 810 840 870 900 930 960 1000"
parent_directory="execs_convergence_testing_corrected_robin_condition/phi_0/"
for rpl in ${Rpl_array}; do
sed -ie "s/R_pl_initial=30.0/R_pl_initial=${rpl}/g" iron_ablation_phi_nonzero_checking.cpp
sed -ie "s/Rpl_30/Rpl_${rpl}/g" iron_ablation_phi_nonzero_checking.cpp
g++ -std=c++0x iron_ablation_phi_nonzero_checking.cpp -o ${parent_directory}/Rpl_${rpl}.exe
sed -ie "s/R_pl_initial=${rpl}/R_pl_initial=30.0/g" iron_ablation_phi_nonzero_checking.cpp
sed -ie "s/Rpl_${rpl}/Rpl_30/g" iron_ablation_phi_nonzero_checking.cpp
done
この問題を解決する別の方法があります。一時 C++ ファイルを使用してコンパイルできます。
答え2
iron_ablation_phi_nonzero_checking.cpp
ループを繰り返すたびにファイルを変更したいのですが、sed
コマンドは置き換えられます。初期の一部の変数の値は、新しい値によって決まります。これは最初の反復でのみ機能します。ループの2回目の反復に達すると、ファイルには初期値ではなく最初の代替結果が含まれているため、コマンドはsed
失敗します。