문장에 특정 단어가 나오는지 확인하기 위해 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 이전에는 두 가지 주요 변형이 있었기 때문입니다. .