これを行うには、ここでは入力ファイル、値を変更したいファイル、2つのシェルスクリプトなど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
次の変数を持つ2番目のファイルの変数割り当てを変更するために、1行に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
、それを2番目のシェルスクリプトに読み込もうとします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
最後に、2番目のシェルスクリプトでは、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