이 작업을 수행하기 위해 여기서는 입력 파일, 값을 변경하려는 파일, 그리고 두 개의 쉘 스크립트 등 4개의 파일을 사용하고 있습니다. 첫 번째 파일 models_linearanalysis_Cep.dat
은 다음과 같이 구성된 입력 파일입니다.
1 0.020 0.700 5.4 1500 4000
2 0.020 0.700 5.4 1500 4050
3 0.020 0.700 5.4 1500 4100
4 0.020 0.700 5.4 1500 4150
5 0.020 0.700 5.4 1500 4200
d_number
1~6열은 각각 카탈로그 번호( ), Z, X, 질량, L 및 Teff 로 구성됩니다 . inlist_rsp_Cepheid
다음 변수가 있는 두 번째 파일의 변수 할당을 변경하기 위해 한 줄에 6개의 값을 사용하고 싶습니다 .
RSP_mass = 4.165d0
RSP_Teff = 6050
RSP_L = 1438.8d0
RSP_X = 0.73d0
RSP_Z = 0.007d0
log_directory='LOGS_1'
photo_directory='photos_1'
LOGS_
이 경우 디렉터리 번호(즉, 다음 숫자 photos_
)는 1입니다.
첫 번째 쉘 스크립트 Inlists_Bash.sh
(아래 표시)에서는 여기 파일의 6개 열에서 값을 읽으려고 하며 models_linearanalysis_Cep.dat
, 이를 두 번째 쉘 스크립트로 읽어들이려고 합니다 inlist_changer.sh
.
while read -ra fields; do
for field in "${fields[@]}"; do
bash inlist_changer.sh <<<"$field"
done
./mk
./rn
done < models_linearanalysis_Cep.dat
마지막으로 두 번째 쉘 스크립트에서는 inlist_changer.sh
입력을 사용하여 inlist_rsp_Cepheid
변수가 적절한 값을 갖도록 라인을 최종 변경합니다.
#!/bin/bash
export OMP_NUM_THREADS=12
#used for testing variables
#export mass=4.165d0
#export teff=6050
#export l=1438.8d0
#export x=0.73d0
#export z=0.007d0
#export d_number=2
#read in inputs from the Inlists_Bash.sh file
read -p d_number z x mass l teff
#inlist directory
export MESA_INLIST="/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist_rsp_Cepheid"
#change the lines in the MESA_INLIST file
sed -i \
-e "s/^\([[:blank:]]*RSP_mass\).*/\1 = $mass/i" \
-e "s/^\([[:blank:]]*RSP_Teff\).*/\1 = $teff/i" \
-e "s/^\([[:blank:]]*RSP_L\).*/\1 = $l/i" \
-e "s/^\([[:blank:]]*RSP_X\).*/\1 = $x/i" \
-e "s/^\([[:blank:]]*RSP_Z\).*/\1 = $z/i" \
-e "s/^\([[:blank:]]*log_directory\).*/\1 = 'LOGS_$d_number'/i" \
-e "s/^\([[:blank:]]*photo_directory\).*/\1 = 'photos_$d_number'/i" \
"$MESA_INLIST"
첫 번째 줄은 inlist_rsp_Cepheid
다음과 같을 것으로 예상됩니다.
RSP_mass = 5.4
RSP_Teff = 4000
RSP_L = 1500
RSP_X = 0.700
RSP_Z = 0.020
log_directory='LOGS_1'
photo_directory='photos_1'
그러나 다음 메시지를 받았을 때 이 파일들 사이의 입력을 읽는 방식에 문제가 있다는 것이 분명해졌습니다.
RSP_mass =
RSP_Teff =
RSP_L =
RSP_X =
RSP_Z = 4000
log_directory='LOGS_'
photo_directory='photos_'
누군가 내가 여기서 무엇을 놓치고 있거나 잘못하고 있는지 설명할 수 있습니까?
답변1
이것을 변경 Inlists_Bash.sh
하고 배열의 6개 값을 모두 한 번에 다음으로 전달합니다 inlist_changer.sh
.
#!/bin/bash
while read -ra fields; do
./inlist_changer.sh "${fields[@]}"
./mk
./rn
done < models_linearanalysis_Cep.dat
프롬프트 문자열(귀하의 경우)을 인쇄하기 위해 .in을 사용하는 대신 inlist_changer.sh
매개변수 사용으로 변경 하고 각 호출에서 변수를 설정하기만 하면 됩니다 $1
.$6
read
-p
read
d_number
z
#!/bin/bash
export OMP_NUM_THREADS=12
mesa_inlist=/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist_rsp_Cepheid
sed -i \
-e "s/^\([[:blank:]]*RSP_mass\).*/\1 = $4/i" \
-e "s/^\([[:blank:]]*RSP_Teff\).*/\1 = $6/i" \
-e "s/^\([[:blank:]]*RSP_L\).*/\1 = $5/i" \
-e "s/^\([[:blank:]]*RSP_X\).*/\1 = $3/i" \
-e "s/^\([[:blank:]]*RSP_Z\).*/\1 = $2/i" \
-e "s/^\([[:blank:]]*log_directory\).*/\1 = 'LOGS_$1'/i" \
-e "s/^\([[:blank:]]*photo_directory\).*/\1 = 'photos_$1'/i" \
"$mesa_inlist"
참고: 내보낸 변수가 필요한 위치가 명확하지 않습니다 OMP_NUM_THREADS
.
아니면 모든 것을 스크립트에 넣으세요:
#!/bin/bash
export OMP_NUM_THREADS=12
mesa_inlist=/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist_rsp_Cepheid
while read -ra fields; do
sed -i \
-e "s/^\([[:blank:]]*RSP_mass\).*/\1 = ${fields[3]}/i" \
-e "s/^\([[:blank:]]*RSP_Teff\).*/\1 = ${fields[5]}/i" \
-e "s/^\([[:blank:]]*RSP_L\).*/\1 = ${fields[4]}/i" \
-e "s/^\([[:blank:]]*RSP_X\).*/\1 = ${fields[2]}/i" \
-e "s/^\([[:blank:]]*RSP_Z\).*/\1 = ${fields[1]}/i" \
-e "s/^\([[:blank:]]*log_directory\).*/\1 = 'LOGS_${fields[0]}'/i" \
-e "s/^\([[:blank:]]*photo_directory\).*/\1 = 'photos_${fields[0]}'/i" \
"$mesa_inlist"
./mk
./rn
done < models_linearanalysis_Cep.dat