在bash中使用readlink并混合变量和字符串来返回绝对路径很困难

llionevans

我有一个配置脚本,用户可以在其中将路径指定为标头部分中的变量。我希望他们能够使用绝对路径,相对路径和变量(因为这实际上是从另一个从它们获取变量值的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/不应该在那里。

感觉应该比较简单。我希望我走在正确的道路上,这是我对“”和“”的使用有问题。但是我尝试了很多变化,但都没有成功。

llionevans

这是我最后得出的解决方案。它混合了@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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有字符串变量的绝对路径

从RouteBase.GetVirtualPath返回绝对路径

包含特殊字符的字符串的绝对路径

一个字符串或脚本中命令的绝对路径变量和别名?

如何配置s:url以返回绝对路径,以使其不受html base影响?

使用JavaScript将相对链接的图像替换为字符串中的绝对路径图像

文件的绝对路径作为bash中的变量

PHP - 修改字符串文本上图像的绝对路径/URL

如何将绝对路径字符串转换为树形 Uri 格式的目录

sed或awk替换模式之间的字符串(将绝对路径转换为相对路径)

使用bash变量使用绝对路径调用命令

如何在Java中使用正确的字符编码获取绝对路径?

在 Angular 2 + Electron 中使用绝对路径

在绝对路径中使用通配符创建文件

在Rails 6中使用绝对路径

Rails:在 Rails 6 中使用绝对路径

为什么在webpack的输出属性的入口点和绝对路径中使用相对路径?

如何流式地图<路径,名单<路径>>到一个List <String>的包含的绝对路径字符串?

如何在Expo和React Native中使用绝对路径导入?

bash中的命令无法使用绝对路径

在 R 中使用 stringr 删除字符串中的几个括号很困难

Linux终端:仅在具有给定文件扩展名的文件中递归搜索字符串;显示文件名和绝对路径

结合绝对路径和相对路径以获得新的绝对路径

如何从绝对路径和相对路径运行bash脚本

Sox绝对路径和管道

在bash中,是否有内置命令来获取相对文件路径的绝对路径?

结合绝对路径和相对路径

使用 Pathlib 确定绝对路径

无法使用绝对路径导入