==
연산자는 쉘 스크립트에서 두 문자열을 비교하는 데 사용됩니다. 그러나 대소 문자를 무시하고 두 문자열을 비교하고 싶습니다. 어떻게 수행 할 수 있습니까? 이에 대한 표준 명령이 있습니까?
==
연산자는 쉘 스크립트에서 두 문자열을 비교하는 데 사용됩니다. 그러나 대소 문자를 무시하고 두 문자열을 비교하고 싶습니다. 어떻게 수행 할 수 있습니까? 이에 대한 표준 명령이 있습니까?
답변:
배쉬가 있다면
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"
}
}'
==
두 문자열을 비교하는 데 사용되지만 응답은 case
명령문을 사용하여 대소 문자를 구분하지 않는 비교를 보여줍니다 . 안심의 shopt
솔루션은 또한의 대소 문자를 구분 사용 가능 ==
, =~
및 기타 문자열 비교 연산자를.
shopt -u nocasematch
bash의 기본값으로 되돌리려면 비교가 끝난 후에 실행하는 것이 현명합니다 .
nocasematch
설정 을 저장하고 복원하는 것이 가장 좋습니다. 그것을 가지고 와서 그것을 SHELLNOCASEMATCH=`shopt -p nocasematch`
변경하고 shopt -s nocasematch
완료되면 그것을 복원하십시오$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
때문에, shopt -p
코드 1과 함께 종료됩니다 옵션이 설정되지 않으며,이 경우 취소 할 수있는 스크립트를 일으킬 수있는 경우에 set -e
유효입니다.
Bash에서는 매개 변수 확장을 사용하여 문자열을 모두 소문자 / 대문자로 수정할 수 있습니다.
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
결과는 다음과 같습니다.-bash: ${var1,,}: bad substitution
shopt -s nocasematch
구현 방법을 모르지만 일반적으로 이러한 "언어 수준"솔루션이 올바르게 처리합니다.
이 모든 대답은 Bash 4가있는 한 가장 쉽고 빠른 방법을 무시합니다.
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
당신이하고있는 일은 두 문자열을 모두 소문자로 변환하고 결과를 비교하는 것입니다.
nocasematch 상태를 저장하십시오 (다른 기능이 사용 불가능한 경우에 따라 다름).
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
참고 : local
함수 안에있는 경우 에만 사용 하십시오.
case
(ghostdog의 대답에 포함) 문은 항상 내 피부 크롤 할 것
한 가지 방법은 두 문자열을 모두 위 또는 아래로 변환하는 것입니다.
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
알파인 (를 sh
통해 제공 되는 busybox
) 기반의 도커 크기의 응용 프로그램에서 방법을 사용했습니다 . 감사합니다.
grep
이 -i
대소 문자를 구분을 의미하므로 VAR2가 var1에있는 경우 당신에게 그것을 요구 플래그.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
들어 zsh
구문 약간 다른,하지만 여기에 대부분의 응답에 비해 여전히 짧은 :
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
비교하기 전에 두 문자열을 모두 대문자로 변환합니다.
또 다른 방법은 zsh 's globbing flags
를 사용하므로 i
glob 플래그 를 사용하여 대소 문자를 구분하지 않는 일치를 직접 사용할 수 있습니다 .
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
대소 문자를 구분하는 패턴 에 대해이 훌륭한 블로그 / 튜토리얼 / 무엇이든 보았습니다 . 다음 세 가지 방법이 예제와 함께 자세히 설명됩니다.
1. 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
2. 대소 문자 패턴이있는 정규식 사용
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
3. nocasematch를 켭니다
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
if
문을 사용하여 문자열을 비교하는 사람 은 단일 브래킷 형식 대신shopt
이중 브래킷[[ ]]
형식의 조건부 를 사용해야합니다[ ]
. 참조 : gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html을