특정 위치에서 변수 값을 변경한 다음 이를 컴파일하여 일련의 숫자에 대해 여러 번 수행하려는 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
변수 값을 먼저 바꾼 다음 문자열을 변경하려고 두 번 사용하고 있습니다. 그런 다음 변경 사항에 대해 컴파일한 다음 rpl의 모든 값을 실행합니다. 그러나 이 코드는 나에게 적합하지 않습니다. 내가 뭘 잘못하고 있는지 궁금합니다.
답변1
스크립트를 작성한 방식으로 기본 C++ 소스 파일을 변경했습니다. 따라서 처음 실행하면 30.0을 30으로 바꾸고 두 번째 실행에서는 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
명령이 대체됩니다 .초기의일부 변수의 값은 새 값에 따라 결정됩니다. 이는 첫 번째 반복에서만 작동합니다. 루프의 두 번째 반복에 도달할 때 파일에는 이미 초기 값이 아닌 첫 번째 대체 결과가 포함되어 있으므로 명령이 sed
실패합니다.