比较变量时忽略某些字符?

比较变量时忽略某些字符?

例如,如果这是我的脚本:

if [[ $yesno == "What's going on" ]]; then

那么我该如何使其忽略',例如??,.

所以基本上Whats going onWhat's going onWhat's going on?What's going on.看起来都是同一件事。我知道我可以|| [[ $yesno == ".. ]]匹配多个变量,但我无法输入每个组合。

答案1

如果您只想让特定示例起作用,您可以使用 bash 正则表达式匹配

[[ $yesno =~ What\'?s\ going\ on[.?]? ]]

我们用反斜杠转义引号和空格。

答案2

您可以在比较之前简单地删除变量中除了字母数字字符之外的所有字符:

$ yesno="What's going on?"
$ if [[ ${yesno//[^a-zA-Z0-9\ ]/} == "Whats going on" ]]; then echo "OK";fi
OK

答案3

最常见和最通用的方法之一是将字符串通过管道传输到grep并检查grep返回代码。该if语句可以检查任何命令或管道的退出代码:

if echo "$yesno" | grep -q "What'*s *going *on[?.]*"; then

除了您提到的字符之外,这还允许单词之间有 0 个或多个空格。

此构造应该适用于 OS X、FreeBSD、GNU/Linux 以及提供 POSIX grep 的任何其他系统:

相关内容