我有一个配置脚本,用户可以在其中将路径指定为标头部分中的变量。我希望他们能够使用绝对路径,相对路径和变量(因为这实际上是从另一个从它们获取变量值的shell脚本中调用的)。在脚本的末尾,所有路径都被写入文本文件。
我面临的挑战是,某些路径中使用的变量可以在脚本中间更改。我在重新评估路径以获取正确的输出时遇到困难。
### HEADER SECTION ###
DIR_PATH="$VAR1/STRING1"
InputDir_DEFAULT="$DIR_PATH/Input"
### END HEADER ###
...some code
if [[ some condition ]]; then DIR_PATH="$VAR2/STRING2"; fi
...more code
# $InputDir_DEFAULT needs re-evaluating here
InputDir=$(readlink -m $InputDir_DEFAULT)
echo $InputDir >> $FILE
当我如上所述做并且满足“某些条件”时,“ echo”的返回是的绝对路径$VAR1/STRING1/Input
,而我想要的是abs的绝对路径$VAR2/STRING2/Input
。
下面是一种替代方法,在该方法中,我尝试InputDir_DEFAULT
通过将自身存储为字符串来停止求值。
### HEADER SECTION ###
DIR_PATH="$VAR1/STRING1"
InputDir_DEFAULT='$DIR_PATH/Input' #NOTE: "" marks have changed to ''
### END HEADER ###
if [[ some condition ]]; then DIR_PATH="$VAR2/STRING2"; fi
STRING_TMP=$InputDir_DEFAULT
InputDir=$(readlink -m $STRING_TMP)
echo $InputDir >> $FILE
这次,“ echo”返回评估变量和未评估字符串的混合:($VAR2/STRING2/$DIR_PATH/Input
对我来说)看起来像/home/ubuntu/STRING2/$DIR_PATH/Input
。只是$DIR_PATH/
不应该在那里。
感觉应该比较简单。我希望我走在正确的道路上,这是我对“”和“”的使用有问题。但是我尝试了很多变化,但都没有成功。
这是我最后得出的解决方案。它混合了@ThatsWhatSheCoded和其他一些东西的建议,以确保用户不必在标头中的任何地方重新定义变量。
我希望有一种更优雅的方法可以做到这一点,但这确实可行。
### HEADER SECTION ###
DIR_PATH_DEFAULT="$VAR1/STRING1"
InputDir_DEFAULT="$DIR_PATH_DEFAULT/Input"
### END HEADER ###
...some code
if [[ some condition ]]; then DIR_PATH="$VAR2/STRING2"; fi
### Checks whether $DIR_PATH_DEFAULT is used in any variables.
### If so and $DIR_PATH is different, will replace string.
### This will be done for all variables in a list.
if [[ ! "$DIR_PATH_DEFAULT" =~ "$DIR_PATH" ]]; then
for i in ${!var[@]}; do
var_def_val=${var[i]}_DEFAULT
STRING_TMP=${!var_def_val}
var_def=${var[$i]}_DEFAULT
if [[ $STRING_TMP == *"$DIR_PATH_DEFAULT"* ]] && [[ ! $var_def == "DIR_PATH_DEFAULT" ]]; then
STRING_TMP="${STRING_TMP/$DIR_PATH_DEFAULT/$DIR_PATH}"
eval "${var_def}=$STRING_TMP"
fi
done
fi
...more code
InputDir=$(readlink -m $InputDir_DEFAULT)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句