我正在做一个需要 shell 脚本编写的研究项目,尽管我确实有一些编程经验,但我几乎没有经验。这是有问题的文件:
export OMP_NUM_THREADS=12
read controls
#inlist directory
export MESA_INLIST="/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist"
我借用这个文件来更改第二个文件的输入/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist
。
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'
我想为这几个变量分配不同的浮点数(或连接到'photos_
和字符串的整数,例如'LOGS_
将其从 更改为LOGS_1
) 。LOGS_2
我会像这样编写 sed 命令吗?我不是问这是否是实现这一目标的唯一方法,而是问这是否是实现这一目标的正确方法之一。
read mass
read Teff
read L
read X
read Z
read d_number
sed -i -e "s/.*\(RSP_mass\).*/\1 = '$mass'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_Teff\).*/\1 = '$Teff'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_L\).*/\1 = '$L'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_X\).*/\1 = '$X'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_Z\).*/\1 = '$Z'/i" "$MESA_INLIST"
sed -i -e "s/.*\(log_directory\).*/\1 = 'LOGS_$d_number'/i" "$MESA_INLIST"
sed -i -e "s/.*\(photo_directory\).*/\1 = 'photos_$d_number'/i" "$MESA_INLIST"
要了解我为什么以这种特定方式编写 sed 命令的上下文,请参阅我之前的问题。
答案1
如果输出满足您的期望,即没有缩进,所有值都用单引号括起来,并且前后始终有一个空格字符=
,我可能会进行这些细微的更改:
- 一个
read
命令(-p
如果支持的话)适用于所有变量。一次编辑所有值(空格/制表符分隔)更容易。 - 一个
sed
电话,已经在之前的回答 - 替换
.*
为^[[:blank:]]*
仅匹配行开头的空格或制表符 - 局部变量使用小写变量名以保持一致性
read -p "Please enter mass, Teff, L, X, Z, directory number: " mass teff l x z d_number
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"
答案2
我认为您不希望除 'LOGS_$d_number' 和 'photos_$d_number' 之外的任何替换变量周围使用单引号。其余变量似乎是数字,并且在它们周围加上单引号可能会使它们转换成字符串,这最多会降低计算速度,或者(取决于您使用的语言)导致变量类型不匹配。我假设 '...d0' 下标的目的是强制这些值成为双浮点数。
取决于您正在做什么:您可以简单地将它们指定为命令行上的参数,而不是在脚本运行后读取变量作为输入...
the_script 4.2d1 5000 1300d0 .5d0 .001d0 3
然后你的脚本(在本例中名为“the_script”)将启动:
mass="$1"
teff="$2"
l="$3"
x="$4"
z="$5"
d_number="$6"
# Simple error checking
if [[ $# -lt 6 ]] ; then
# print message to stderr with >&2 rather than standard output
# $0 is the script filename
echo "$0 : too few variables on the command line. We wanted 6 but got $#." >&2
exit 2
fi
您还可以将“MESA_INLIST”作为命令行参数而不是导出变量。