文で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

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つの主なバリエーションがあったからです。 。

関連情報