文に特定の単語が含まれていることを確認するために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
Bourne シェル この最近では珍しい恐竜になったため、Bourne シェルではなく POSIX シェル構文に言及しているようです。
とにかく答えはどちらの場合も同じです。
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シェルは文字を指定できます([[:alpha:]]を使用)。しかし、文字を指定できるBourneシェルのバリエーションはわかりません。したがって、POSIXシェルを使用すると、次のことができます。
word_delimiter='[![:alnum:]_]'
case +$INPUT+ in
(*${word_delimiter}dolor${word_delimiter}*) echo true;;
(*) echo false;;
esac
Bourne シェルでは、次の米国文字を使用する必要があります。
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シェルを使用するシステムと同じくらい古いシステムを処理する必要がある場合は、「tr」構文に問題がある可能性があります。 POSIX以前は、2つの主なバリエーションがあったからです。 。