해당 내용은 Datacamp의 Data engineering track을 정리했습니다.
Introduction to Bash Scripting의 chapter 3에 대한 내용입니다.
해당 포스팅에는 아래의 내용을 포함하고 있습니다.
- 조건문 사용하기
- 반복문 사용하기
- CASE statement
1. IF statements
Bash script에서도 조건문에 의해 실행할 지 결정할 수 있어야 합니다. 이러한 기능을 위해 IF 조건문을 활용할 수 있습니다.
if [ CONDITION ]; then
# SOME CODE
else
# SOME OTHER CODE
fi
조건문은 일반적으로 파이썬과 동일하게 사용하지만, CONDITION 앞 뒤로 공백이 존재해야 하며, 조건문 이후에는 세미콜론을 반드시 적어줘야 합니다. 마지막으로 모든 if문이 종료되면 fi로 조건문이 종료되었음을 알려줘야합니다.
x="Queen"
if [ $x == "King" ]; then
echo "$x is a King!"
else
echo "$x is not a King!"
fi
> Queen is not a King!
또한 조건문을 감싸고 있는 대괄호는 소괄호 2개로 대체할 수 있습니다.
x=10
if (($x > 5)); then
echo "$x is more than 5!"
fi
> 10 is more than 5!
위의 예시처럼 등호, 부등호 등은 Flag를 사용할 수도 있습니다. -eq(equal to), -ne(not equal to), -lt(less than), -le(less than or equal to), -gt(greater than), -ge(greater than or equal to)를 기호 대신 사용할 수 있습니다.
x=10
if [ $x -gt 5 ]; then
echo "$x is more than 5!"
fi
> 10 is more than 5!
이외에도 다양한 flag가 존재합니다. -e(if the file exists), -s(if the file exists and has size greater than zero), -r(if the file exists and is readable), -w(if the file exists and is writable) 등이 존재하며, 자세한 내용을 보시려면 사이트를 찾아보시는 것을 추천드립니다. 또한 여러 개의 조건을 AND(&&)나 OR(||) 조건으로 묶을 수 있습니다.
#1
x=10
if [ $x -gt 5 ] && [ $x -lt 11 ]; then
echo "$x is more than 5 and less than 11!"
fi
#2
x=10
if [[ $x -gt 5 && $x -lt 11 ]]; then
echo "$x is more than 5 and less than 11!"
fi
1번과 2번 모두 동일한 결과를 얻을 수 있습니다. 또한 조건문에 command-line 명령을 넣을 수 있습니다. 이전에 사용했던 명령처럼 활용하기 보다는 해당 command-line이 실행되면 True, 아니면 False의 형태로 계산됩니다.
if grep -q Hello words.txt; then
echo "Hello is inside!"
fi
> Hello is inside!
if $(grep -q Hello words.txt); then
echo "Hello is inside!"
fi
> Hello is inside!
2. FOR loops & WHILE statements
이번에는 FOR와 WHILE 문을 활용해서 스크립트를 반복하는 방법을 소개합니다.
for x in 1 2 3
do
echo $x
done
> 1
> 2
> 3
Bash script에서도 python에서 사용하는 range와 같은 방법으로 수를 생성할 수 있습니다. {start..stop..increment}를 사용하면 됩니다. 기본적으로 increment가 주어지지 않으면 1씩 증가합니다. 이것 외에도 다양한 방법이 존재합니다. ((x=2; x<=4; x+=2))와 같은 방식으로 x도 포함해서 작성해 줄 수 있습니다.
for book in books/*
do
echo $book
done
> books/book1.txt
> books/book2.txt
꼭 숫자만 사용해야 하는 것은 아니고 glob에 의해 경로를 불러오는 것도 가능합니다.
for book in $(ls books/ | grep -i 'air')
do
echo $book
done
> AirportBook.txt
> FairMarketBook.txt
command-line 명령어로 특정 조건을 만족하는 파일을 가져올 수도 있습니다. WHILE 문은 크게 다르지 않습니다.
x=1
while [ $x -le 3 ];
do
echo $x
((x+=1))
done
> 1
> 2
> 3
3. CASE statements
CASE 문은 복잡하고 여러 IF문으로 중첩된 경우 더 명확하고 효율적인 코드를 만드는 데 도움이 됩니다.
if grep -q 'sydney' $1; then
mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
rm $1
fi
if grep -q 'canberra' $1; then
mv $1 "IMPROTANT_$1"
fi
위의 예시처럼 다양한 조건에 맞을 때, command-line이 바뀌게 됩니다. 이런 경우에는 CASE 문을 통해 간결하게 만들 수 있습니다. CASE 문은 다음과 같은 형태로 만들 수 있습니다.
case 'STRINGVAR' in
PATTERN1)
COMMAND1;;
PATTERN2)
COMMAND2;;
*)
DEFAULT COMMAND;;
esac
위의 코드는 대략적인 case 문 형태입니다.
case $(cat $1) in
*sydney*)
mv $1 sydney/ ;;
*melbourne*|*brisbane*)
rm $1 ;;
*canberra*)
mv $1 "IMPORTANT_$1" ;;
*sydney*는 정규표현식으로 일치하는 지를 확인하는 것입니다.