我知道这有效:
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
(默认启用)。