我在这里使用四个文件来完成此任务:一个输入文件、我要更改其值的文件以及两个 shell 脚本。第一个文件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
1-6 列分别组织为目录号 ( d_number
)、Z、X、质量、L 和 Teff。我想使用每行的 6 个值来更改第二个文件中变量的分配,inlist_rsp_Cepheid
该文件具有以下变量:
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。
在我的第一个 shell 脚本Inlists_Bash.sh
(如下所示)中,我尝试从此处文件的六列中读取值models_linearanalysis_Cep.dat
,我打算将其读入第二个 shell 脚本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
最后,在第二个 shell 脚本中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
为此并将数组的所有六个值一次传递到inlist_changer.sh
:
#!/bin/bash
while read -ra fields; do
./inlist_changer.sh "${fields[@]}"
./mk
./rn
done < models_linearanalysis_Cep.dat
更改inlist_changer.sh
为使用参数$1
...$6
而不是使用read
.
in用于打印提示字符串(在您的情况下) -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