琐碎追求:bash 环境变量

琐碎追求:bash 环境变量

我知道这有效:

FNAME="$(basename $LD_PRELOAD)"
FNAME="${FNAME%.*}"

这能用一行代码表达出来吗?到目前为止,这是两次不成功的尝试:

${$(basename LD_PRELOAD)%.*}


${`$(basename $LD_PRELOAD)`%.*}

提前致谢。

答案1

是的,明白我在 StackOverflow 上的回答。根据您的情况,它将是以下内容:

FNAME="${LD_PRELOAD//@(*\/|.*)}"

请注意,LD_PRELOAD 可以包含多个以 分隔的路径:,并且我的回答与您的尝试有相同的限制basename

另外,我的答案是%%而不是%,这意味着它将删除第一个点之后的所有内容,而不是最后一个点。这可能是您想要的,因为您的用例似乎想要libQt5Gui/usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.15不是。我不知道如何用do而不是 来libQt5Gui.so.5制作一行代码。如果您想要,您只需将其添加到引号后即可。${//}%%%.so

您的目标“从脚本名称中剥离路径和扩展名,以便只留下基本名称”,实际上可以在单个 Bash 表达式中实现,而无需子 shell 或命令。在面对嵌套参数扩展的 XY 问题之前,重要的是要问${parameter%word}${parameter##word}是完成这项工作的正确工具。由于这是一个文件路径,因此可以使用${parameter//pattern/string}@(pattern‐list)glob 提供shopt -s extglob(默认启用)。

相关内容