다디와 괴발개발

bash 스크립트와 .sh 파일의 조건문 / 반복문 본문

DevOps/Linux

bash 스크립트와 .sh 파일의 조건문 / 반복문

아임다디 2022. 3. 30. 16:36

쉘(Shell) 이란?

쉘은 운영체제의 기능이나 서비스를 구현할 수 있는 명령어를 사용자에게 받아 실행할 수 있는 인터페이스를 제공해준다. 즉, 사용자와 운영체제의 사다리 역할을 해주는 것이 쉘.

리눅스는 bash 쉘을 표준으로 사용하고 있다.

.sh 파일 만든 후 실행해보기

first.sh 파일을 생성해준 후, 실행해보자.

# first.sh
echo Hello World #세미콜론을 붙이지 않는다

파일을 실행하기에 앞서, chmod로 권한을 부여해주어야 실행이 가능하다.

chmod 755 first.sh # 755는 소유자만 모든 권한을 갖고있고, 그 외 사용자는 읽기, 실행은 가능하나 쓰기는 불가능하다. (쓰기, 읽기, 실행)
./first.sh # 파일 실행

이번에는 first2.sh 파일을 만들어 다양한 예제들이 어떻게 출력되는지 확인해보자

# first2.sh
echo "Hello    World" # 정상 출력
echo "Hello World" # 정상 출력
echo "Hello * World" # 정상 출력
echo Hello * World # * 에는 현재 파일/폴더 목록들이 나온다
echo Hello    World # 정상 출력
echo "Hello" World # 정상 출력
echo Hello "    " World # 정상 출력
echo "Hello "*" World" #정상 출력
echo hello world # hello가 command가 없다고 나옴
echo 'hello' world # 정상 출력

* 를 그냥 쓰게 되면 현재 파일과 폴더 목록들이 나온다.

변수

리눅스 쉘에서 변수를 할당할 때는 반드시 = 앞뒤로 공백이 없어야한다. 환경변수 값 지정해줄 때를 생각해보자!

# var.sh
MY_MESSAGE="Hello World"
echo $MY_MESSAGE

read를 이용하여 변수를 읽고 출력도 가능하다

# var2.sh
echo What is your name?
read MY_NAME
echo "Hello $MY_NAME - hope you're well."

var1.sh 에서 지정해준 MY_NAME이 출력되는 것을 확인할 수 있다

변수를 지정하기 전에는 어떤 값으로 출력 될까? 빈 값(null) 값으로 출력된다

# myvar2.sh
echo "MYVAR is: $MYVAR"
MYVAR="hi there"
echo "MYVAR is: $MYVAR"

Q. 그렇다면 쉘에서 MYVAR 변수에 값을 할당해준다면 결과가 어떻게 나올까?

A. 쉘에서 변수를 할당해주더라도 값이 반영되지 않는다.

Q. export를 이용하여 환경변수로 반영을 해준다면??

A. 환경변수로 설정해주면 파일에서도 정상 반영이 된다.

Q. echo를 이용하여 MYVAR 값을 출력해주면 어떤 값이 나올까?

A. 파일의 hi there 값이 아닌 쉘에서 할당했던 값인 hello가 출력된다

Q. 그렇다면 파일에서 할당했던 환경변수 값을 쉘에서도 적용시키려면 어떻게 해야될까?

A. . (dot) 명령어를 앞에 붙인 후 실행해주면 쉘 환경변수로 반영이 된다!

 

이번엔 쉘 스크립트로 파일을 생성해보자. touch 명령어를 활용해볼 것이다.

# user.sh
echo "What is your name?"
read USER_NAME
echo "Hello $USER_NAME"
echo "I will create you a file called ${USER_NAME}_file"
touch "${USER_NAME}_file"

ls 명령을 통해 이름_file이 만들어진 것을 확인할 수 있다.


반복문

쉘 스크립트에서 사용할 수 있는 반복문에는 for과 while이 있다.

1. for

# for.sh
for i in 1 2 3 4 5
do
 echo "Looping ... number $i"
done

# for2.sh
for i in hello 1 * 2 goodbye
do
 echo "Looping ... i is set to $i"
done

이렇게하면 어떤 결과가 나올까?

*가 i로 들어가면서 현재 존재하는 파일과 폴더들이 출력된다

2. while

while은 [ ] 를 통해 종료 조건을 넣을 수 있고, 무한 루프를 원한다면 : 를 사용하면 된다

# while.sh
INPUT_STRING=hello
while [ "$INPUT_STRING" != "bye" ]
do
 echo "Please type something in (bye to quit)"
 read INPUT_STRING
 echo "You typed: $INPUT_STRING"
done

종료조건에 해당하는 bye를 입력하니 반복문이 종료

while : 를 사용할 때, while과 : 사이에 반드시 공백이 있어야 한다. 그렇지 않으면 command error가 발생한다!

# while2.sh
while :
do
 echo "Please type something in (^C to quit)"
 read INPUT_STRING
 echo "You typed: $INPUT_STRING"
done

반복문 안에서 조건이 필요한 경우에는 caseesac를 이용하여 작성해주면 된다.

# while3.sh
while read input_text
do
 case $input_text in
	hello)		echo English	;;
	howdy)		echo American	;;
	gday)		echo Australian	;;
	bonjour)	echo French	;;
	"guten tag")	echo German	;;
	*)		echo Unkown Language: $input_text	;;
 esac
done < myfile.txt
# myfile.txt
this file is called myfile.txt and we are using it as an example input.
hello
gday
bonjour
hola

정말 신기한 친구들이다.


조건문

쉘의 조건문 구성은 다음과 같다

if [ ... ]
then
	# if-code
else
	# else-code
fi # if의 거꾸로인 fi인 것을 반드시 기억

아이고 복잡하다.

조건문을 활용하여 매직 넘버를 맞추는 코드를 짜보았다.

# test3.sh
echo -en "Please guess the magic number: "
read X
echo $X | grep "[^0-9]" > /dev/null 2>&1
if [ "$?" -eq "0" ]; then
 # If the grep found something other than 0-9
 # then it's not an integer
 echo "Sorry, wanted a number"
else
 if [ "$X" -eq "7" ]; then
  echo "You entered the magic number!"
 fi
fi

while 에서 조건을 확인하기 위해 case를 사용하였는데, if 역시도 사용 가능하다

# test2.sh
X=0
while [ -n "$X" ]
do
 echo "Enter some text (RETURN to quit)"
 read X
 if [ -n "$X" ]; then # return 입력시 바로 종료되도록 하기 위해
   echo "You said: $X"
 fi
done

마치면서

오우오우 정말.. 이때까지 다양한 언어들을 접해왔고.. 고대언어 포트란도 써본적이 있는데, 이렇게 복잡한 조건문과 반복문은 처음인 것 같다. 정말 대단한 친구이다.

사용법이 특이한 친구인 만큼 사용법을 잘 숙지하자!

'DevOps > Linux' 카테고리의 다른 글

[Linux] 관리자 권한과 sudo  (0) 2022.04.26
환경변수 사용법  (0) 2022.03.30
리눅스 출력 관련 명령어  (0) 2022.03.30
리다이렉션과 파이프라인  (0) 2022.03.19
표준 스트림과 stdin, stdout, stderr  (0) 2022.03.18