在句子中查找带有 Bourne Shell (sh) 的单词

在句子中查找带有 Bourne Shell (sh) 的单词

我正在尝试使用 Bourne Shell (sh) 确定特定单词是否出现在句子中。例如:

#!/bin/bash
INPUT='Lorem ipsum dolor sit amet.'

if [[ "$INPUT" == *dolor* ]]
then
    echo "So true"
else
    echo "Not true"
fi

这适用于bash,但我不能使用bash,我需要一些适用于sh

答案1

我怀疑您指的是 POSIX shell 语法而不是 Bourne shell,因为 Bourne shell 如今已成为一种罕见的恐龙。

无论如何,这两种情况的答案是相同的:

case $INPUT in
  *dolor*) echo true;;
  *) echo false;;
esac

;;前面的最后一个esac不是必需的。 POSIX 语法还允许(*dolor*).

答案2

您可以使用其他工具:

  • grepif echo "$INPUT" | grep --quiet '\bdolor\b'

答案3

如果您想可移植地匹配整个单词,首先,您需要定义单词的分隔方式。如果我们采用 GNU grep-w的定义,那么单词就是字母、数字或下划线的序列(分隔符可以是除这些字符之外的任何字符)。不幸的是,“字母”的定义取决于语言环境。 POSIX shell 可以指定字母(使用 [[:alpha:]],但我不知道 Bourne shell 的任何变体可以指定字母。因此,使用 POSIX shell,您可以执行以下操作:

word_delimiter='[![:alnum:]_]'
case +$INPUT+ in
 (*${word_delimiter}dolor${word_delimiter}*) echo true;;
 (*) echo false;;
esac

在 Bourne shell 中,您必须采用美国字母:

word_delimiter='[!a-zA-Z0-9_]'
case +$INPUT+ in
  *${word_delimiter}dolor${word_delimiter}*) echo true;;
  *) echo false;;
esac

其他选项:

if
  tr -cs '[:alnum:]_' '[\n*]' << EOF | grep -qx dolor
$INPUT
EOF
then
  echo true
else
  echo false
fi

虽然该语法是 POSIX,但如果您必须处理像具有 Bourne shell 一样古老的系统,您可能会遇到“tr”语法的问题,因为在 POSIX 之前的旧时代,它曾经有两个主要变体。

相关内容