본문 바로가기

CS/리눅스

Shell 스크립트_제어문과 함수

✏️[ if~else 문 ] 

if [ 조건 ] -> 띄어쓰기 꼭! ifV[V조건V]
then
	참일 경우 실행 
else 
	거짓인 경우 실행 
fi 

 

✔️ if 문의 조건 안에 들어갈 수 있는 것 조건 형태 

출처 : 이것이 우분투 리눅스다
출처 : 이것이 우분투 리눅스다

✔️ 파일과 관련된 조건

출처: 이것이 우분투 리눅스다

✔️예시 

01 #!/bin/sh
02 fname=/lib/systemd/
            system/cron.service
03 if [ -f $fname ]
-> 파일이 일반 파일이면
04 then
05    head -5 $fname 
-> 앞부분 5줄을 출력한다. 
06 else
07    echo “cron 서버가 설치되지 않았습니다."
08 fi
09 exit 0

 

✏️[ case~esac 문 ]

if 문이 2중 분기라고 하며 case문은 다중 분기라고 한다.

그리고 끝에 세미콜론 2개 찍는다. 

✔️예시 

01 #!/bin/sh
02 echo "리눅스가 재미있나요? (yes / no)"
03 read answer
04 case $answer in
05    yes | y | Y | Yes | YES) -> | 는 "또는"을 의미한다. 
06       echo "다행입니다."
07       echo "더욱 열심히 하세요 ^^";;

08    [nN]*) -> n 또는 N이 앞에 들어가면 
09       echo "안타깝네요. ㅠㅠ";;

10    *) -> 이외의 것들
11       echo "yes 아니면 no만 
				입력했어야죠"
12       exit 1;; -> 비정상적 종료 
13 esac
14 exit 0

 

✏️ [ 관계연산자 (AND, OR) ]

  • and = ‘-a’ 또는 ‘&&’
  • or는 ‘-o’ 또는 ‘||’

*-a 또는 -o는 테스트문 ([ ] )안에서 사용할 수 있는데 이때 괄호 등의 특수 문자 앞에는 역슬래시(\)를 붙여야 한다.

✔️예시 

#!/bin/sh
echo "보고싶은 파일명을 입력하세요"
read fname
if [ -f $fname ] && [ -s $fname ] ; then # if [ \\(-f $fname \\) -a \\(-s $fname \\) ]; 와 같다
	head -5 $fname
else
	echo "파일이 없거나, 크기가 0입니다"
if
exit 0

 

✏️ [ 반복문 (for ~ in 문) ]

for 변수 in 값1 값2 값3... -> 값1, 값2, 값3이 순서대로 변수에 들어가면서 실행 
do 
	반복할 문장 
done

✔️예시 1

#!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10  #-> for((i=1;i<=10;i++)) 또는 for i in ‘seq 1 10’로 변경 할 수 있음
do
	hap=`expr $hap + $i`
done
echo "1부터 10까지의 합 : "$hap
exit 0

 

✔️예시 2

01 #!/bin/sh
02 for fname in $(ls *.sh) 
-> .sh 형식으로 된 파일 리스트가 만들어진다. 하나식 fname으로 들어간다. (파일의 개수만큼 실행된다)
03 do
04    echo "--------$fname-------"
05    head -3 $fname #앞의 3줄을 입력 
06 done
07 exit 0

 

✏️ [ while 문 ] 

  • 무한루프 조건 → while[ : ], while[ 1 ]

✔️예시 

01 #!/bin/sh
02 hap=0
03 i=1
04 while [ $i -le 10 ] 
-> 10보다 작거나 같을 때 동안 반복 
05 do
06    hap=`expr $hap + $i`
07    i='expr $i + 1'
08 done
09 echo "1부터 10까지의 합 : "$hap
10 exit 0

 

✏️ [ until 문 ] 

while문과 용도는 같지만 until문은 조건식이 참(거짓인 동안)일 때까지 계속 반복한다.

 

✏️ [ break, continue, exit, return 문 ] 

  • break - 반복문 종료
  • continue = 반복문의 조건식으로 다시 돌아감
  • exit = 프로그램을 종료함
  • return = 함수 안에서 사용할 수 있으며 함수를 호출한 곳으로 돌아간다.

✏️ [ 사용자 정의 함수 ] 

[형식]

함수이름() {
내용들 
}
함수이름 -> 함수를 호출한다. 
01 #!/bin/sh
02 myFunction () {
03    echo "함수 안으로 들어 왔음"
04    return #return 문이 없어도 된다. 
05 }
06 echo "프로그램을 시작합니다."
-> 호출하는 부분 
07 myFunction

08 echo "프로그램을 종료합니다."
09 exit 0

[ 함수의 파라미터 사용 ] 

함수이름(){
$1, $2 .. 등을 사용 
}
함수이름 파라미터1 파라미터2 -> 함수를 호출 

01 #!/bin/sh
02 hap () {
03    echo `expr $1 + $2`
04 }
05 echo "10 더하기 20을 실행합니다"
06 hap 10 20
07 exit 0
  • 호출할 때 함수 이름에 넘겨줄 파라미터를 공백으로 분리해서 차례대로 적어준다.

 

✏️ [ eval ] 

= 문자열을 명령문으로 인식하고 실행

eval 자체가 명령 키워드이다. 

01 #!/bin/sh
02 str="ls -l eval.sh"
03 echo $str
04 eval $str
05 exit 0
  • $(명령어) 와 eval의 차이

$() = command substitution = 쉬운말로 명령어 결과값

결과값이 어떠한 변수에 대입된다고 볼 수 있다. 

하지만 eval은 실행만 해주는 것이다.

 

✏️ [ export ] 

  • 외부 변수로 선언해준다.
  • 즉, 선언한 변수를 다른 프로그램에서도 사용할 수 있도록 해준다. 
  • 파일 2개를 만들고 앞에서 만든 파일에 들어있는 명령을 실행하게 만든다.
⦁	exp1.sh
01 #!/bin/sh
02 echo $var1
03 echo $var2
-> 외부변수를 참조하고 있으므로 출력 가능 
04 exit 0

⦁	exp2.sh
01 #!/bin/sh
02 var1="지역 변수"
03 export var2="외부 변수"
04 sh exp1.sh
05 exit 0

 

✏️ [ printf ] 

C언어의 printf() 함수와 비슷하게 “형식을 지정해서”출력한다. 

01 #!/bin/sh
02 var1=100.5
03 var2="재미있는 리눅스~~"
04 printf "%5.2f \\n\\n \\t %s \\n" $var1 "$var2"
05 exit
  • 공백이 있으므로 printf를 “”로 묶어야 한다.
  • %5.2f는 총 5자리이며 소수점 아래 2자리까지 출력하라는 의미이다.
  • %s는 문자열을 출력한다.

 

✏️[ set과 $(명령어) ]

  • 리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용한다.
  • 결과를 파라미터로 사용하고자 할 때 set과 함께 사용
01 #!/bin/sh
02 echo "오늘 날짜는 $(date) 입니다."
03 set $(date)
04 echo "오늘은 $4 요일 입니다."
05 exit 0
  • date명령을 실행한 결과를 보여준다.
    • $(date) = 를 통해 “2020. 05. 20 (수) 10:08:57 KST 입니다”라는 결과를 얻을 수 있다.
  • $(date)의 결과가 $1, $2~ 등의 파라미터 변수에 저장된다.
  • set을 통해 위의 결과를 파라미터 $1 = 2020. $2 = 05. $3 = 20 $4 = (수) $5 = 10:08:57 $6 = KST로 저장된다.

그래서 $4 = (수)이므로 $4를 통해 (수)라는 값을 가져올 수 있다.

 

✏️ [ shift ] 

파라미터 변수를 왼쪽으로 한 단계씩 이동시킨다.

파라미터가 많을 때 이런 방식으로 하나씩 읽어오면 좋을 것이다.

01 #!/bin/sh
02 myfunc() {
03 	str=""
04 	while [ "$1" != "" ] ; do
05 		str="$str $1" 
-> $1자리에 shift가 되면서 AAA, BBB, ...순서대로 $1이 된다. 
06 		shift
07 	done
08 	echo $str
09 }
10 myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
11 exit 0

-> 결과 : AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
  • shift = 전체 파라미터를 왼쪽으로 시프트시킨다. 즉, $2 → $1, $3 → $2, 의 형태로 작업이 일어난다.

 

이 글은 "이것이 우분투 리눅스다" 책을 읽고 쓴 글입니다. 

'CS > 리눅스' 카테고리의 다른 글

Shell 스크립트_특징  (0) 2022.06.25