我在匹配sh
shell 中的通配符字符串时遇到问题。代码是 a 的一部分,configure.ac
因此它通常会获得最糟糕的外壳。我不能指望 Bash shell。
代码首先执行:
LDNAME=`basename "$LD"`
Run Code Online (Sandbox Code Playgroud)
我有时会得到一个像ld -m x86_64
or的字符串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 *
(不带引号)和其他一些具有相同结果的变体。
如何在使用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
Run Code Online (Sandbox Code Playgroud)
这应该有效:
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:
.