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

2 shell string wildcards case

我在匹配shshell 中的通配符字符串时遇到问题。代码是 a 的一部分,configure.ac因此它通常会获得最糟糕的外壳。我不能指望 Bash shell。

代码首先执行:

LDNAME=`basename "$LD"`
Run Code Online (Sandbox Code Playgroud)

我有时会得到一个像ld -m x86_64or的字符串ld -m elf64lppc,但我想要ld一个友好的显示名称。

然后我根据How to check substring in shell script bash? ,子字符串检查 shell 脚本中的 IF 条件,并使用语句与通配符进行if/else 比较case

case "$LDNAME" in
    "ld -m*") LDNAME=ld
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

字符串匹配失败,我取回了原始字符串。我也尝试过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
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 5

这应该有效:

LDNAME="ld -m blah"
case "$LDNAME" in "ld -m"*) echo foo;; esac
Run Code Online (Sandbox Code Playgroud)

您需要不加*引号地保留通配符,否则将其视为文字字符。

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

LDNAME="ld -m blah"
LDNAME=${LDNAME%% -m*}
echo ":$LDNAME:"
Run Code Online (Sandbox Code Playgroud)

:ld:.