문장에서 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 이전에는 두 가지 주요 변형이 있었기 때문입니다. .

관련 정보