반달가면 이글루에서 백업 - http://bahndal.egloos.com/570500
변수에 저장된 문자열이 특정한 문자열과 비교해서 같은지 아닌지를 판단할 때 통상 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
'bash script' 카테고리의 다른 글
[bash: awk] 특정 위치(field)에 대한 문자열 검색 (0) | 2023.06.29 |
---|---|
[bash: date] 타임스탬프(timestamp)를 일반적인 표시 형식으로 변환 (0) | 2023.06.28 |
[bash: expect] 다중 사용자 환경에서 보안을 강화한 작업 자동화 (0) | 2023.06.20 |
[bash: expect] 리눅스 다중 사용자(multi-user) 환경에서의 작업 자동화 문제 (0) | 2023.06.20 |
[bash: expect] rsync 자동 원격 백업 (0) | 2023.05.03 |