我在 shell 中匹配通配符字符串时遇到问题sh
。该代码是 a 的一部分configure.ac
,因此它通常会获得可用的最蹩脚的 shell。我不能指望 Bash shell。
代码首先执行:
LDNAME=`basename "$LD"`
有时我会得到一个类似ld -m x86_64
or 的字符串ld -m elf64lppc
,但我只想ld
作为一个友好的显示名称。
然后我根据如何在shell脚本bash中检查子字符串?,shell 脚本中 IF 条件中的子字符串检查和if/else 与通配符比较使用case
语句:
case "$LDNAME" in
"ld -m*") LDNAME=ld
;;
esac
该字符串无法匹配,我取回了原始字符串。我也尝试过ld -m *
(不带引号)和其他一些变体,但结果相同。
如何使用sh
shell 匹配 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:
.