shell script

#3 조건문, 반복문

Sila 2022. 12. 18. 18:33

이번엔 쉘 스크립트에서 조건문, 반복문을 사용하는 방법을 알아보자.

 

1. 조건문

JS와 큰 차이는 없는데 조건을 주는 방식이 약간 다르다.

 

JS에서는 if, else if, else문이 있었는데, 쉘 스크립트는 else if 대신 elif를 사용하며,

 

조건문을 fi 명령어로 닫아줘야 한다.

 

우선 조건을 어떤 형식으로 넣어야 하는지를 알아본 후,

 

가장 단순한 형태인 if문을 시작으로 if-else, if-elif-else문까지 사용해보자.

 

JS에서 어떤 두 값을 비교해 두 값의 대소 비교를 하거나 동일한지를 확인할 때,

 

혹은 하나의 값이 원하는 값이 맞는지 확인하기 위해서는 부등호나 등호 등을 사용했다.

 

쉘 스크립트에서는 이런 관계나 조건 등을 조금 다른 방식으로 적어줘야

 

조건문을 사용할 때 문제가 없다.

 

# 숫자 비교

-eq : equal - 두 숫자가 동일한지

-ne : not equal - 두 숫자가 동일하지 않은지

-lt : less than - A가 B보다 작은지

-le : less than or equal : A가 B보다 작거나 같은지

-gt : greater than : A가 B보다 큰지

-ge : greater than or eqaul : A가 B보다 크거나 같은지

 

# string 비교

-z string : empty string - string이 공백인지

-n string : not empty string - string이 공백이 아닌지

string == string : 두 string이 동일한지

string != string : 두 string이 동일하지 않은지

 

# and. or, not
# 이는 JS와 동일하다.

! : not

x && y : x and y

x || y : x or y

 

# file을 대상으로 하는 경우

-e file : exists - 해당 파일이 존재하는지

-r file : readbale - 해당 파일이 readable한지

-w file : writable - 해당 파일이 wirtable한지

-x file : executable - 해당 파일이 실행가능한지

-d file : directory - 해당 파일의 디렉토리

-s file : size is - 해당 파일의 사이즈가 0 바이트보다 큰지

-f file : File

 

이런 조건들을 어느 정도는 기억해두어야 조건문을 원하는대로 사용할 수 있다.

1. if 문

if문은 자음과 같이 써줄 수 있다.

# if.sh
#!/bin/bash

if [ <condition> ]; then
# 대괄호 안에 조건을 넣어준다.
	<command>
# 조건을 만족할시 수행할 코드를 입력한다.

fi
# fi로 조건문을 닫는다.

 

임의의 string과 숫자가 조건을 만족하는지 확인하기 위해 다음과 같이 쉘 스크립트 파일을 작성할 수 있다.

 

#!/bin/bash

name="lsj"

if [ $name == "lsj" ]; then
# 조건을 넣을 때는 꺽쇠 괄호에서 한 칸 씩 띄워줘야 한다.
	echo "My name is $name"
    # 조건을 만족할 경우 변수의 값을 출력한다.
fi
# 조건문을 닫아준다.

 

띄어쓰기에 유의하자. 꺽쇠 괄호 안에 들어갈 조건문은 괄호와 한 칸씩 띄워줘야 한다.

 

조건문에 숫자가 연관될 시 다음과 같은 형식으로 써주면 된다.

 

# cont'd

if n=7
if [ -n -lt 10 ]; then
	echo "one digit num"
fi

 

이를 실행하면 순서대로

 

my name is lsj
one digit num

 

이 출력될 것이다.

 

2. elif, else

방금 작성한 파일을 조금 더 수정해 elif, else문을 넣어보자.

 

#!/bin/bash

read -p "Insert name : " name
# 프롬프트에 이름을 입력하라는 문구가 출력되며, 이름을 입력하면 다음으로 진행된다.

if [ $name == "lsj" ]; then
	echo "my name is lsj"
elif [ $name == "kim" ] then
	echo "my name is kim"
else
	echo "not enlisted"
fi

 

이름이 lsj 혹은 kim 이면 이름을 출력해주고,

 

그 외의 이름은 등록되지 않았다는 문자열을 출력해주는 코드를 다음과 같이 짤 수 있다.

 

사실 이건 굳이 elif문을 사용하지 않고 or 연산자를 이용하면 if - else문으로 표현할 수도 있다.

 

다음과 같이 수정해주자.

 

#!/bin/bash

read -p "Insert name : " name

if [[ $name == "lsj" || $name == "kim" ]]; then
# and, or을 이용해 조건을 2개 넣고 싶을 때는 
# (쉘에 따라 다르지만) 꺽쇠 괄호를 두 개 사용해주도록 한다.
    echo "my name is $name"
else
    echo "not enlisted"
fi

 

 

마찬가지로 숫자의 자릿수를 출력해주는 코드도 다음과 같이 수정해줄 수 있다.

 

# cont'd

read -p "Insert Num : " num

if [ $num -lt 10 ]; then
	echo "digit : 1"
elif [ $num -lt 100 ]; then
	echo "digit : 2"
else
	echo "equal to/more than 3 digits"
fi

 

파일을 실행하면 프롬프트에 숫자를 입력해달라는 문구가 출력될 것이고,

 

임의의 숫자를 입력해주면 10 미만의 수는 if문이, 10~99범위의 수는 elif문이, 그 외에는 else문이 실행될 것이다.

 

3. file

다음으로는 특정 파일을 대상으로 조건문을 거는 방법에 대해 알아보자.

 

여기서는 간단하게 파일이 있는지 보고, 있다면 그 파일이 일기 가능한지, 쓰기 가능한지 여부를 확인할 것이다.

 

#!/bin/bash

read -p "file name? " file

echo "file name: $file"

if [ -e $file ]; then
	echo "file exists"
	# file이 존재한다면 존재한다는 문구를 출력 후, 일기, 쓰기 가능 여부 확인 코드로 이동
else
	echo "file not exist"
	exit 0
	# 파일이 존재하지 않는다면 스크립트 종료
fi

if [ -r file ]; then
	echo "file has read access"
else
	echo "file is not readable"
fi

if [ -w file ]; then
	echo "file has write access"
else
	echo "file is not writable"
fi

 

나는 ex.txt 파일을 만들고 (동일한 경로에 만든다.) 프롬프트에 ex.txt를 입력했다.

 

결과로 읽기 가능, 쓰기 가능 여부가 출력 되었으며,

 

존재하지 않는 파일을 입력하면 존재하지 않는다는 문구만이 출력된다.

 

 

2. 반복문

다음으로 반복문을 사용해보자.

 

따로 쓰려다가 양이 많지 않아서 반복문과 함께 기록해두기로 했다.

 

포맷은 다음과 같이 써준다.

 

조건문과 마찬가지로 약간의 사소한 부분을 빼면 JS와 동일하다

 

for((exp1; exp2; exp3;))
# 언제부터 언제까지 반복할 것인지를 써주고
do
	command1
	command2
	command3
done
# 반복문이 도는 동안 무슨 행동을 할지 command들을
# do, done 사이에 적어주면 된다.

 

간단하게 1~10까지 출력하는 코드를 작성해보자.

for ((c=1; c<=10; c++))
# JS와 마찬가지로 초깃값, 반복 조건, 증감
	do echo "value : $c"
    # 조건을 만족하면 실행할 행동을 do 뒤에 붗여준다.
done
# done으로 for문을 닫아준다.

 

다른 방식으로 반복 조건을 제시해줄 수도 있다. 

 

아래처럼 중괄호 안에 숫자를 쭉 써줄 수도 있고

 

for val in {1...10}
# {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 와 동일한 의미
do
	echo $val
done

 

혹은 이렇게 전부 쓸 수도 있다. 이렇게 쓸 경우, 원하는 숫자만 포함해 반복문을 돌릴 수도 있다.

 

for val in 1 2 3 4 5 8 9 10
# 중간에 몇 개 숫자를 빼면 그 숫자는 제외하고 1~10까지 반복문을 돌려준다.
do
	echo $val
done
# 1 2 3 4 5 8 9 10

 

이를 약간 더 응용해 내가 넣어준 변수를 순서대로 출력할 수도 있다.

 

for var in $@
do
	echo $var
done

 

다음 글에서는 지금까지 공부한 내용들을 한 번 wrap up 하는 의미에서

 

지금까지 공부한 문법들을 활용해 간단한 코드를 짜보는 걸 연습해볼 예정이다.

 

 

'shell script' 카테고리의 다른 글

#4 switch-case문, 함수  (0) 2023.01.14
#2 변수 선언, 기호  (0) 2022.12.13
#1. shell  (0) 2022.12.10