대소문자를 구분하지 않는 셸 스크립트의 문자열 비교
그==연산자는 셸 스크립트에서 두 문자열을 비교하는 데 사용됩니다.그런데 케이스를 무시한 두 문자열을 비교하고 싶은데 어떻게 해야 하나요?이것에 대한 표준 명령어가 있습니까?
Bash에서 매개 변수 확장을 사용하여 문자열을 모든 소문자/대소문자로 수정할 수 있습니다.
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
다음과 같은 답변은 모두 이를 위한 가장 쉽고 빠른 방법을 무시합니다(Bash 4가 있는 경우).
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
거기서 하는 일은 두 문자열을 모두 소문자로 변환하고 결과를 비교하는 것뿐입니다.
기회가 된다면,
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
그렇지 않으면, 당신은 우리에게 당신이 어떤 쉘을 사용하고 있는지 말해줘야 합니다.
대체, awk 사용
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
상태 저장nocasematch(비활성화 여부에 따라 다른 기능이 달라지는 경우):
local orig_nocasematch=$(shopt -p nocasematch; true)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
참고:
local는 함수 내부에서만 필요합니다.
그리고 또.; true부품은 다음과 같은 경우 셸이 나가는 것을 방지합니다.set -e설정되어 있습니다.$(shopt -p nocasematch)(대소문자 일치가 전혀 설정되지 않았기 때문에) 실패합니다.
한 가지 방법은 두 문자열을 모두 상한 또는 하한으로 변환하는 것입니다.
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
다른 방법은 grep를 사용하는 것입니다.
echo "string" | grep -qi '^String$' && echo same || echo different
대소문자를 구분하는 패턴을 다루는 훌륭한 블로그/자습서/무엇이든 알게 되었습니다.다음 세 가지 방법이 예제와 함께 자세히 설명되어 있습니다.
tr 명령을 사용하여 패턴을 소문자로 변환
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
케이스 패턴이 있는 조심스러운 글러브 사용
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
대소문자 일치 설정
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
위해서zsh구문은 약간 다르지만 여전히 대부분의 답변보다 짧습니다.
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
비교하기 전에 두 문자열을 모두 대문자로 변환합니다.
다른 방법은 zsh's를 사용하는데, 이를 통해 대소문자를 구분하지 않는 매칭을 직접 사용할 수 있습니다.i글로벌 플래그:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
# this example compares the variable with a literal string 'match'
[[ $str1 = (#i)match ]] && echo "Match success"
korn 쉘의 경우 typet built-in 명령어( 소문자는 l, 대문자는 -u)를 사용합니다.
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
대소문자를 구분하지 않는 줄 비교를 수행하려면 매우 쉽습니다.
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
tr을 사용한 제 솔루션은 다음과 같습니다.
var1=match
var2=MATCH
var1=`echo $var1 | tr '[A-Z]' '[a-z]'`
var2=`echo $var2 | tr '[A-Z]' '[a-z]'`
if [ "$var1" = "$var2" ] ; then
echo "MATCH"
fi
grep을 가지고 있습니다.-i대소문자를 구분하지 않음을 의미하는 플래그이므로 var2가 var1에 있는지 알려달라고 요청합니다.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
쇼핑백이 든 가방
'tr' 유틸리티(번역 문자)는 모든 Unix/Linux 컴퓨터에 항상 있으며 경량입니다.
대소문자를 구분하지 않는 비교를 처리하는 데 사용할 수 있는 기능이 있습니다.'tr'의 정확한 위치는 다양할 수 있으므로 먼저 가능한 위치를 조사하고 "BIN_TR"이라는 이름의 환경에 정확한 위치를 저장합니다.
declare BIN_TR=$( ls /bin/tr /usr/bin/tr 2>/dev/null | head -1 );
그런 다음 함수 선언에 사용됩니다.
toLowerCase() {
echo "$*" | $BIN_TR '[:upper:]' '[:lower:]'
}
'tr'을 사용하는 솔루션은 다양한 OS와 OS 설정 간에 이동성이 높을 것으로 예상됩니다.'awk'도 가능성이 높지만 'tr' 유틸리티는 'awk'에 비해 작기 때문에 'tr'을 사용하는 함수는 무게가 더 가볍습니다.
유닉스 계열 운영 체제에서 test 명령은 파일 형식을 확인하고 값을 비교합니다.
str1="MATCH"
str2="match"
if test $str1 = $str2
then
echo "equal yes"
else
echo "equal not"
fi
유닉스 계열 운영 체제에서 test 명령은 파일 형식을 확인하고 값을 비교합니다.
그렇게 하면 아주 간단합니다.
두세 줄의 암호로
언급URL : https://stackoverflow.com/questions/1728683/case-insensitive-comparison-of-strings-in-shell-script
'programing' 카테고리의 다른 글
| 인수를 위한 밑줄이 있는 파이썬의 람다? (0) | 2023.07.29 |
|---|---|
| PHP 오류:함수 이름은 문자열이어야 합니다. (0) | 2023.07.29 |
| 도커 실행 대 생성 (0) | 2023.07.29 |
| MySQL 구문:이게 뭐야? (0) | 2023.07.29 |
| 크롬의 요소 검사기에서 CSS 규칙이 회색으로 표시되는 것은 무엇을 의미합니까? (0) | 2023.07.29 |