使用 sh shell 匹配 case 语句中的通配符字符串

使用 sh shell 匹配 case 语句中的通配符字符串

我在 shell 中匹配通配符字符串时遇到问题sh。该代码是 a 的一部分configure.ac,因此它通常会获得可用的最蹩脚的 shell。我不能指望 Bash shell。

代码首先执行:

LDNAME=`basename "$LD"`

有时我会得到一个类似ld -m x86_64or 的字符串ld -m elf64lppc,但我只想ld作为一个友好的显示名称。

然后我根据如何在shell脚本bash中检查子字符串?,shell 脚本中 IF 条件中的子字符串检查if/else 与通配符比较使用case语句:

case "$LDNAME" in
    "ld -m*") LDNAME=ld
    ;;
esac

该字符串无法匹配,我取回了原始字符串。我也尝试过ld -m *(不带引号)和其他一些变体,但结果相同。

如何使用shshell 匹配 case 语句中的通配符字符串?


这可行,但可扩展性不太好:

if test "$LDNAME" = "ld -m elf_x86_64"; then
   LDNAME=ld
fi
if test "$LDNAME" = "ld -m elf64lppc"; then
   LDNAME=ld
fi

答案1

这应该有效:

LDNAME="ld -m blah"
case "$LDNAME" in "ld -m"*) echo foo;; esac

您需要将通配符*不加引号,否则它将被视为文字字符。

但实际上,如果您只想删除-m及其后面的任何内容,您可以使用LDNAME=${LDNAME%% -m*}.

LDNAME="ld -m blah"
LDNAME=${LDNAME%% -m*}
echo ":$LDNAME:"

给出:ld:.

相关内容