[bash: if, case] 문자열 비교 조건에 정규표현식 사용 리눅스 bash script

변수에 저장된 문자열이 특정한 문자열과 비교해서 같은지 아닌지를 판단할 때 통상 if 구문을 사용하게 된다.

# 변수 str의 값이 abcd인지 비교
if [[ $str == "abcd" ]]
  then echo "변수 str의 값은 abcd입니다."
  else echo "변수 str의 값은 abcd가 아닙니다."
fi


만약 변수의 값이 대소문자에 관계 없이 abcd인지 확인하려면, 즉 Abcd, ABcd, aBcd, ... 이런 경우라면 어떻게 할까? 정규표현식(regular expression)으로는 "[Aa][Bb][Cc][Dd]" 이렇게 간단하므로 이것을 활용하면 되겠다.

변수 str의 값을 출력한 후에 grep 명령으로 정규 표현식을 적용하고 유효한 출력값이 있는지 없는지 판단하면 될 것이다. 아래의 예시를 보자. 변수 str에 대해 grep 명령으로 정규표현식을 적용하고 wc 명령으로 출력값의 행 수를 센 값을 str_chk 변수에 할당한다. 만약 str의 값이 정규표현식에 부합한다면 str_chk의 값은 1이 될 것이고, 그렇지 않다면 0이 될 것이다.

# 변수 str의 값이 정규표현식 [Aa][Bb][Cc][Dd]에 부합하는지 비교
str_chk=`echo "$str" | grep "^[Aa][Bb][Cc][Dd]$" | wc -l`
if [[ $str_chk -ge 1 ]]
  then echo "변수 str의 값은 정규표현식 [Aa][Bb][Cc][Dd]에 부합합니다."
  else echo "변수 str의 값은 정규표현식 [Aa][Bb][Cc][Dd]에 부합하지 않습니다."
fi


str_chk 변수를 사용하지 않고 아래의 예시처럼 if 구문에 역따옴표(`) 부분을 통합해서 사용해도 무방하다.

if [[ `echo "$str" | grep "^[Aa][Bb][Cc][Dd]$" | wc -l` -ge 1 ]]
  then echo "변수 str의 값은 정규표현식 [Aa][Bb][Cc][Dd]에 부합합니다."
  else echo "변수 str의 값은 정규표현식 [Aa][Bb][Cc][Dd]에 부합하지 않습니다."
fi


if 구문 대신에 case 구문을 이용해도 된다. 아래의 예시를 보자.

# 변수 str의 값이 정규표현식 [Aa][Bb][Cc][Dd]에 부합하는지 비교 (case 구문)
case $str in
  [Aa][Bb][Cc][Dd]) echo "변수 str의 값은 정규표현식 [Aa][Bb][Cc][Dd]에 부합합니다."
    ;;
  *) echo "변수 str의 값은 정규표현식 [Aa][Bb][Cc][Dd]에 부합하지 않습니다."
    ;;
esac


사용자 입력을 받아서 변수에 할당하고 비교할 때 대소문자 차이 등 다양한 변형에 대응해야 하는 경우 요긴하게 사용할 수 있다.

조금 더 나아가 보자. 사용자로부터 yes 또는 no를 입력 받아야 하는데 y 또는 n으로 입력할 수도 있고 대문자가 섞일 수도 있는 경우를 생각해 보자. 위의 정규 표현식에 다중 문자열 검색을 조합하면 된다. (grep 명령을 이용한 다중 문자열 검색은 이전 게시물을 참고하자. 여기로)

# 사용자가 입력한 값을 변수 str에 저장
read str
# yes/no 판단: [Yy] 또는 [Yy][Ee][Ss], [Nn] 또는 [Nn][Oo]
if [[ `echo $str | grep "^[Yy]$\|^[Yy][Ee][Ss]$" | wc -l` -ge 1 ]]
  then echo "yes"
elif [[ `echo $str | grep "^[Nn]$\|^[Nn][Oo]$" | wc -l` -ge 1 ]]
  then echo "no"
else echo "잘못된 입력입니다."
fi


아래의 예시처럼 case 구문으로도 적용 가능하다. 논리합(OR) 연산에 파이프(|) 기호를 이용한다.

read str
case $str in
  [Yy]|[Yy][Ee][Ss]) echo "yes"
    ;;
  [Nn]|[Nn][Oo]) echo "no"
    ;;
  *) echo "잘못된 입력입니다."
    ;;
esac




핑백

덧글

댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

515889
4772
1903203

ad_widget_2