我正在尝试使用 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
您可以使用其他工具:
grep
:if 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 之前的旧时代,它曾经有两个主要变体。