본문 바로가기
컴퓨터과학[3-2]/U.N.I.X

UNIX - [제10강] 쉘 스크립트

by boolean 2016. 7. 20.
728x90

UNIX - [제10강] 쉘 스크립트

● 쉘 스크립트 개요 ● 리다이렉션, 쉘 변수 ● 조건문과 순환문, 디버깅

  • UNIX 용어정리
    쉘 스크립트
    여러 커맨드를 포함하는 텍스트 파일로 쉘이 해석하여 처리할 수 있다. 쉘 스크립트에 존재하는 커맨드는 쉘 커맨드, 컴파일된 실행 프로그램 및 다른 쉘 스크립트가 가능하다. 일반 프로그램과 같이 변수 선언이 가능하고 조건문과 순환문과 같은 제어 구조를 사용할하여 작성할 수 있다.
  • 리다이렉션
    프로그램 수행을 위한 입력을 키보드(표준 입력)로부터 받지 않고 파일로부터 받도록 리다이렉션할 수 있다. 또 표준 출력이나 표준 에러를 화면으로 보내지 않고 파일로 출력하도록 리다이렉션할 수 있다.
  • 쉘 스크립트 함수
    함수는 스크립트 코드의 블록으로 이름을 가진다. 코드 블록을 재사용을 위해 함수로 정의해 두면, 스크립트 파일이나 쉘 프롬프트에서 함수 이름을 사용하여 호출할 수 있다. 함수를 정의할 때 인자를 사용할 수 있다.

요점정리

  1. 쉘 스크립트의 조건문이나 순환문에서 사용할 수 있는 비교 연산자, 검사 연산자, 논리 연산자, 산술 연산자는 어떤 것이 있는지 나열하고 test 명령을 이용한 조건 검사 방법을 설명하시오.
    • 정수 비교 연산자
      • int1 –eq int2 : int1과 int2의 값이 같음
      • int1 –ne int2 : int1과 int2의 값이 같지 않음
      • int1 –gt int2 : int1이 int2보다 큼
      • int1 –lt int2 : int1이 int2보다 작음
      • int1 –ge int2 : int1이 int2보다 크거나 같음
      • int1 –le int2 : int1이 int2보다 작거나 같음
    • 문자열 비교 연산자
      • string1 = string2 (또는 string1 == string2) : string1과 string2가 같음
      • string1 != string2 : string1과 string2가 같지 않음
      • string : string이 정의되어 있고 NULL 이 아님
      • -z string : string이 정의되어 있지 않거나 NULL 임
    • 파일 검사 연산자
      • -e file : file이 존재함
      • -f file : file이 존재하며 일반 파일이고 디렉터리가 아님
      • -d dir : dir이 존재하며 디렉터리임
      • -r file : file이 존재하며 읽기 가능
      • -w file : file이 존재하며 쓰기 가능
      • -x file : file이 존재하며 실행 가능
    • 논리 연산자
      • !condition : NOT
      • condition1 -a condition2 : AND
      • condition1 –o condition2 : OR
    • 조건문이나 순환문에서는 ‘test condition’ 또는 ‘[ condition ]’으로 조건을 검사할 수 있다. 비교 연산자, 검사 연산자, 논리 연산자를 이용하여 표현식의 조합이 가능하다.
      조건 검사의 예는 다음과 같다.
      if test $a -eq $b  (변수 a의 값이 변수 b의 값과 같으면)
      if [ $1 = unix ]  (첫 번째 명령행 인수가 'unix'이면)
      if [ $1 = unix -a $2 = system ]  (첫 번째 명령행 인수가 'unix‘이고 두 번째 명령행 인수가 ‘system')
      while test $A -lt 0  (변수 A의 값이 0보다 크면)
      while [ -e test.txt ]  (test.txt 파일이 존재하면)
    • ‘test condition’ 또는 ‘[ condition ]’는 다음 논리 연산자로 조합이 가능하다.
      • ! : NOT
      • && : AND
      • || : OR
    • ‘test condition’ 또는 ‘[ condition ]’를 논리 연산자로 조합한 예는 다음과 같다.
      if [ $# -gt 0 ] && [ $# -lt 4 ]  ( if [$# -gt 0 -a $# -lt 4 ]의 의미와 동일함)
  2. 쉘 스크립트의 expr 명령은 무엇이며 expr 명령에서 사용 가능한 산술 연산자 및 논리 연산자는 어떤 것이 있는지 나열하고 간단한 예를 드시오.
    • expr 명령은 ‘expr expression’ 형태로 사용되며 ‘expr expression’의 결과값은 expression을 평가한 값이다.
      쉘 명령 프롬프트에서 다음과 같은 명령을 수행할 수 있다.
      expr 1 + 2  (더하기 연산의 결과인 3이 출력됨)
      expr 1 \* 2  (곱하기 연산의 결과인 2가 출력됨)
      expr 1 \< 2  (비교 연산 <의 결과가 참이므로 1이 출력됨)
      expr 1 \> 2  (비교 연산 >의 결과가 거짓이므로 0이 출력됨)
    • 산술 연산자
      • + : 더하기
      • - : 빼기
      • * : 곱하기 (wildcard 문자와 혼돈을 피하기 위해 \*로 표현)
      • / : 나누기
      • % : 나머지
    • 비교 연산자
      • = : 같다
      • != : 같지 않다
      • < : 작다 (redirection 문자와 혼돈을 피하기 위해 \<로 표현)
      • > : 크다 (redirection 문자와 혼돈을 피하기 위해 \>로 표현)
      • <= : 작거나 같다(redirection 문자와 혼돈을 피하기 위해 \<=로 표현)
      • >= : 크거나 같다(redirection 문자와 혼돈을 피하기 위해 \>=로 표현)
    • 논리 연산자
      • & : AND
      • | : OR
    • 쉘 스크립트에서는 '$( )' 기호를 이용하여 '$( )' 자리를 expr 명령의 결과값으로 치환하여야 산술식의 값을 구할 수 있다.
      쉘 스크립트 내에서 사용 예는 다음과 같다. 참고로 변수에 expr 명령의 결과값을 대입하기 위해서는 'sum=$('와 같이 ‘변수명’, ‘=’, ‘$’, ‘(’ 사이에 공백을 두어서는 안 된다.
      sum=$( expr $a + $b )
      sub=$( expr $a - $b )
      mul=$( expr $a \* $b )
      div=$( expr $a / $b )
      mod=$( expr $a % $b )
  3. 쉘에서 사용하는 따옴표의 의미를 구분하시오.
    • '…' : 안의 특수 문자를 해석하지 않음
      예 : echo ' " $PATH " ' (" $PATH " 가 그대로 출력됨)
    • "…" : '…'와 같으나 일부 특수 문자를 해석함
    • $, \, ` 등의 특수 문자해석함
      예 : echo " ' $PATH ' "
      (겹따옴표 안에 있으므로 홑따옴표 문자가 그대로 출력되고 $ 문자는 해석되므로 홑따옴표로 둘러싸인 PATH 환경변수 값이 출력됨)
    • `…` 또는 $(…) : 안의 명령을 실행함. 둘러싸인 명령을 실행하는 것을 command substitution라고 함
      예1 : echo " Today is `date` "
      ('Today is' 문자열에 이어 date 명령이 실행결과가 출력됨)
      예2 : echo $( expr 3 \* 7 )
      (expr 명령이 실행되어 21이 출력됨)
  4. 쉘의 순환문 형식은 어떤 것이 있는지 기술하시오.
    • 순환문의 종류
      • do ~ done 사이의 구문을 지정한 조건만큼 반복
      • 순환문의 종류 : for, while, until
      • for 문 : 각 원소에 대해 구문을 수행
      • while 문 : 조건이 참인 동안 구문을 수행
      • until 문 : 조건이 거짓인 동안 구문을 수행
    • for 문
      • 형식
        for 변수 in list1 ... listn   또는 for ((초기값; 조건; 증가식))
        do
          문장(들)
        done
      • for 문 조건의 예
        예1 : for num in 1 2 3 4 5 6 7 8 9
        예2 : for (( num=1; num<=9; num++ ))
    • while 문
      • 형식
        while 조건
        do
          문장(들)
        done
      • while 문 조건의 예
        예1 : while [ $num –le 9 ]
        예2 : while test $num –le 9
    • until 문
      • 형식
        until 조건
        do
          문장(들)
        done
      • until 문 조건의 예
        예1 : until [ $num –gt 9 ]
        예2 : until test $num –gt 9
  5. 쉘의 조건문 형식과 비교 연산의 종류에 대해 설명하시오.
    • 조건문 형식은 다음과 같다. elif 부분은 없을 수도 있고 여러 개가 올 수도 있다. else 부분은 있어도 되고 없어도 된다.
      if [조건1]; then
        문장 1
      elif [조건2]; then
        문장 2
        ㆍㆍㆍ
      elif [조건n-1]; then
        문장 n-1
      else
        문장 n
      fi
    • 비교 연산의 종류은 다음과 같다.
      A –eq B : A와 B의 값이 같다
      A –ne B : A와 B의 값이 같지 않다
      A –gt B : A가 B보다 크다
      A –lt B : A가 B보다 작다
      A –ge B : A가 B보다 크거나 같다
      A –le B : A가 B보다 작거나 같다
  6. 쉘의 스크립트에서 함수를 정의하는 형식을 설명하시오.
    • 함수
      • 특정한 일을 수행하는 기능이 구현된 코드 블록
      • 함수 정의
        function 함수명
        {
          문장(들)
        }
      • 함수 호출 형식
        : 함수명 또는 함수명 인자(들)
      • 함수 호출 예
        : 명령행 인수가 있으면 해당 단의 구구단을 출력하고 인수가 없으면 사용법을 출력하는 쉘 스크립트이다. mult $1 으로 첫 번째 명령행 인수를 mult 함수에 인수로 넘겨준다.
        #!/bin/bash
        function mult
        {
          for ((i=1; i<=9; i++))
          do
            echo " $1 * $i = $( expr $1 \* $i ) "
          done
        }
        if [ $# -eq 0 ]
        then
          echo "Usage: $0 integer_number"
        else
          mult $1
        fi

연습문제

  • 연습문제1
    쉘 스크립트를 /bin/bash이 해석한다는 의미로 쉘 스크립트 파일의 첫 번째 행에 지정해야 하는 내용은?
    답을 체크하세요
    정답 :
    해설 : #!/bin/bash이 쉘 스크립트를 /bin/bash이 해석한다는 의미이다.
  • 연습문제2
    다음 중 쉘 스크립트에서 첫 번째 명령행 인수를 뜻하는 것은?
    답을 체크하세요
    정답 :
    해설 : ${1}이 첫 번째 명령행 인수를 의미한다.
  • 연습문제3
    다음의 쉘에서 사용하는 특수 문자 중 둘러싸인 내용을 전혀 해석하지 말라는 의미를 가진 것은?
    답을 체크하세요
    정답 :
    해설 : 쉘은 홑따옴표로 둘러싸인 내용을 전혀 해석하지 않는다.
    (Escape 문자인 ‘\’의 경우도 해석하지 않고 ‘\’ 문자 그대로 출력함)
  • 연습문제4
    다음 쉘 스크립트를 실행했을 때의 출력은?
    for ((n=1; n<=10; n=n+2))
    do
      a=$( expr $a + $n )
    done
    echo $a
    답을 체크하세요
    정답 :
    해설 : 순환문을 해석하면 결과적으로 a = 1 + 3 + 5 + 7 + 9 이고 echo $a이므로 a의 값인 25가 출력된다.
  • 연습문제5
    다음은 쉘의 test 명령에서 사용할 수 있는 연산의 일부이다.
    파일이 존재하는지 확인하는 연산은?
    답을 체크하세요
    정답 :
    해설 : test -e file 또는 [ -e file ]로 file의 존재여부를 확인할 수 있다.


pratical centos 리눅스 활용 교재 연습문제 풀이

10강. 쉘 스크립트
l 쉘 스크립트
Ÿ 쉘은 명령어들을 연속적으로 실행하는 인터프리터 환경을 제공
Ÿ 쉘 스크립트는 제어문과 변수 선언 등이 가능하며 프로그래밍 언어와 유사
Ÿ 프로그래밍 언어와 스크립트 언어
-프로그래밍 언어를 사용하는 경우 소스 코드를 컴파일 하여 실행 가능한 파일로 만들어야 함
-일반적으로 실행 파일은 다른 운영 체제로 이식되지 않음
-스크립트 언어를 사용하면 컴파일 과정이 없고 인터프리터가 소스 파일에서 명령문을 판독하
여 각각의 명령을 수행
l 쉘 스크립트 언어
Ÿ
일반적으로 ‘.sh’라는 확장자를 가짐
01 : #!/bin/bash
02 : echo Hello Linux
Ÿ 01 : #!/bin/bash 는 해당 스크립트를 실행하기 위한 쉘의 경로
Ÿ 02 : 실제 명령
Ÿ 스크립트 파일에 실행 권한을 부여해야 실행 가능
∘ chmod u+x myscript.sh
Ÿ
‘./파일명’으로 실행
∘ 예: ./myscript.sh
l 쉘 스크립트 예
Ÿ mydir 파일을 작성한 후 실행권한을 부여하고 실행함
Ÿ ‘vi mydir’로 파일을 편집 (i로 입력모드, 로 명령모드, ZZ)
#!/bin/bash
ls –l * > ~/mydir.txt
cat ~/mydir.txt | more
Ÿ
실행권한 부여
∘ chmod 'u+x,g+x' mydir 또는 chmod +x mydir
Ÿ
실행
∘ ./mydir
l 리다이렉션(redirection)
Ÿ
리다이렉션은 입력과 출력의 방향을 파일로 바꾸는 것
∘ 표준입력(stdin), 표준출력(stdout), 표준에러(stderr)
Ÿ 표준입력을 파일로 지정 : < 또는 << 사용
Ÿ 표준출력을 파일로 지정 : > 또는 >> 사용
∘ 예: cat x y > holdŸ
표준에러를 파일로 지정
∘ 예: cat x y 2> hold
Ÿ
표준에러를 파일로, 표준출력을 표준에러로 보내기
∘ 예: cat x y 2> hold 1>&2
l 쉘 스크립트와 변수
Ÿ
환경 변수
∘ 초기 설정에 대한 정보를 저장하는 변수 : HOME, PATH 등
Ÿ
특수 변수
∘ 쉘 프로그램에
전달되는 특수 변수
∘ $ {인수번호} : 명령 행 인수(argument)
∘ $? : 직전 명령의 상태 값
∘ $# : 명령 행 인수의 개수
∘ 예 : echo “$0 $1”
Ÿ
또는 ls –l $ {1 } > ~/mydir.txt
프로그램 변수
∘ 쉘 스크립트의 변수는 필요 시 선언하여 사용할 수 있음
∘ 변수의 데이터 타입(숫자, 문자, 문자열)을 정할 필요 없음
l 변수 선언
Ÿ
변수명 = 값
#!/bin/bash
STR="Have a good day!"
echo $STR
l 조건문
Ÿ
조건이 만족되면 수행(if~)
#!/bin/bash
a=10
b=20
if [ $a -lt $b ]; then
echo $b
fi
Ÿ
조건이 만족되거나 조건이 만족되지 않을 때(if~ else)
#!/bin/bash
if [ $ {1 } -gt $ {2 } ]; then
echo $ {1 }
else
echo $ {2 }
fi
Ÿ
여러 조건이 주어지거나 아무 조건도 만족되지 않을 때(if~ elif~ else)
#!/bin/bashif [ $ {1 } -lt 1 ]; then
echo "Less than 1"
elif [ $ {1 } -gt 3 ]; then
echo "Greater than 3"
else
if [ $ {1 } -eq 1 ]; then
echo "one"
elif [ $ {1 } -eq 2 ]; then
echo "two"
elif [ $ {1 } -eq 3 ]; then
echo "three"
fi
fi
l 조건 검사
Ÿ
test 조건식 또는 [ 조건식 ]
l 정수 비교 조건식
Ÿ
A –eq B : A와 B의 값이 같음
∘ 예: if [ $# -eq 0 ]
($# 은 명령행 인수의 개수)
Ÿ A –ne B : A와 B의 값이 같지 않음
Ÿ A –gt B : A가 B보다 큼
Ÿ A –lt B : A가 B보다 작음
Ÿ A –ge B : A가 B보다 크거나 같음
Ÿ A –le B : A가 B보다 작거나 같음
l 문자열 비교 조건식
Ÿ
string1 = string2 : string1과 string2가 같음 (또는 ==)
∘ 예1 : if [ $1 = hi ]
∘ 예2 : if test $1 == "hi"
Ÿ
string1 != string2 : string1과 string2가 같지 않음
∘ 예 : if [ $1 != 'bye' ]
Ÿ string : string이 정의되어 있고 NULL 이 아님
Ÿ -z string : string이 정의되어 있지 않거나 NULL 임
l 파일 비교 조건식
Ÿ -e file : file이 존재함
Ÿ -f file : file이 존재하며 일반 파일이고 디렉터리가 아님
Ÿ -d dir : dir이 존재하며 디렉터리임
Ÿ -r(또는 w, x) file : file이 존재하며 읽기(또는 쓰기, 실행) 가능l 논리 연산
Ÿ !표현식 : NOT을 표현
Ÿ 조건식1 –a 조건식2 : AND을 표현
Ÿ 조건식1 –o 조건식2 : OR을 표현
l 따옴표의 의미
Ÿ
'...' : 안의 내용을 해석하지 않음. 특수 문자를 일반 문자로 취급
∘ 예 : echo '"$PATH"' (“ ”안에 적힌 문자열이 그대로 출력됨)
Ÿ
"..." : 마찬가지로 특수 문자를 일반 문자로 취급. 단, 특수 문자 $, \, ` 는 해석함
∘ 예: echo "'$PATH'" (PATH에 설정된 경로가 ‘ ’ 내부에 출력됨)
Ÿ
`...` 또는 $(...) : 안의 내용을 실행(command substitution)
∘ 예1 : echo "Today is `date`“ 또는 : echo "Today is $(date)"
∘ 예2 : echo $( expr 3 \* 7 )
l 연산자
Ÿ 산술 연산자
Ÿ +, -, *, /, % : 더하기, 빼기, 곱하기, 나누기, 나머지
∘ 예: sum = $(expr $a + $b)
∘ 예: mul = $(expr $a \* $b)
<- 백슬래시를 사용해야 함
∘ 예: mod = `expr $a % $b`
Ÿ 논리 연산자
Ÿ !, &&, || : NOT, AND, OR
∘ 예: if [ $# -gt 0 ] && [ $# -lt 4 ]
∘ 예: if [$# -gt 0 -a $# -lt 4 ]
<- 대괄호 안에서 –a를 사용함
l 순환문
Ÿ do ~ done 사이의 구문을 지정한 조건만큼 반복
Ÿ 순환문의 종류 : for, while, until
Ÿ for 문 : 각 원소에 대해 구문을 수행
Ÿ while 문 : 조건이 참인 동안 구문을 수행
Ÿ until 문 : 조건이 거짓인 동안 구문을 수행
l 순환문 - for 문
for 변수 in list1 list2 list3 또는 for ((초기값; 조건; 증가식))
do
문장(들)
done
Ÿ
for 문 조건의 예
∘ 예1 : for num in 1 2 3 4 5 6 7 8 9
∘ 예2 : for (( num=1; num<=9; num++ ))
Ÿ
for 순환문 사용 예#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 integer_number"
else
# for num in 1 2 3 4 5 6 7 8 9
for ((num= 1; num<= 9; num++) )
do
echo " $1 * $num = ` expr $1 \* $num ` "
done
fi
l 순환문 - while 문
while 조건
do
문장(들)
done
Ÿ
while 문 조건의 예
∘ 예1 : while [ $num –le 9 ]
∘ 예2 : while test $num –le 9
Ÿ
while 순환문 사용 예
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 integer_number"
else
num=1
while [ $num -le 9 ]
do
echo " $1 * $num = $(expr $1 \* $num) "
num=`expr $num + 1`
done
fi
l 순환문 - until 문
until 조건
do
문장(들)
done
Ÿ
until 문 조건의 예
∘ 예1 : until [ $num –gt 9 ]
∘ 예2 : until test $num –gt 9
Ÿ
until 문 사용 예#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 integer_number"
else
num=1
until [ $num -gt 9 ]
do
echo " $1 * $num = $(expr $1 \* $num) "
num=` expr $num + 1 `
done
fi
l 함수
Ÿ 특정한 일을 수행하는 기능이 구현된 코드 블록
Ÿ 함수 정의
function 함수명
{
문장(들)
}
Ÿ
함수 호출 방법
∘ 함수명 또는 함수명 인자(들)
Ÿ
함수 사용 예
#!/bin/bash
function mult()
{
for ((i=1; i<=9; i++))
do
echo " $1 * $i = `expr $1 \* $i` "
done
}
if [ $# -eq 0 ]; then
for ((num=1; num<=9; num++))
do
mult $num
done
else
mult $1
fi
l 디버깅
Ÿ
쉘 스크립트의 첫 번째 행에 –x를 추가∘ #!/bin/bash –x
Ÿ
실행 과정을 자세히 보여줌
l 다음 문제의 정답을 고르시오.
13. BASH 쉘에서 다음 중 abc라는 쉘 스크립트를 디버깅 모드에서 실행하는
옵션은?
1 sh –d abc 2 sh -c abc
3 sh –s abc 4 sh -x abc
l 다음 문제에 대한 정답을 서술하시오.
16. 다음과 같이 입력한 숫자대로 삼각형을 출력하는 쉘 스크립트를 작성하시오.
Number : 4
****
***
**
*
#!/bin/bash
echo -n "Input : "
read num
while [ 1 -le $num ]
do
num2=1
while [ $num2 -le $num ]
do
echo -n "*"
let num2=num2+1
done
echo
let num=num-1
done
17. 점수를 입력받아 입력한 점수에 대하여 학점(A, B, C, D, F)으로 환산해 주
는 쉘 스크립트를 작성하시오.
※ 점수의 처리 조건
A 학점 : 90점 이상
B 학점 : 80점 이상
C 학점 : 70점 이상
D 학점 : 60점 이상
F 학점 : 60점 미만
※ 처리 형태
input : 93A
thank you! bye~!
#!/bin/bash
echo -n "input : "
read num
if [ $num -ge 90 ]; then
echo A
elif [ $num -ge 80 ]; then
echo "B"
elif [ $num -ge 70 ]; then
echo "C"
elif [ $num -ge 60 ]; then
echo "D"
else
echo "F"
fi
echo "thank you! bye~"

댓글