728x90
UNIX - [제10강] 쉘 스크립트
● 쉘 스크립트 개요 ● 리다이렉션, 쉘 변수 ● 조건문과 순환문, 디버깅
- UNIX 용어정리
- 쉘 스크립트
- 여러 커맨드를 포함하는 텍스트 파일로 쉘이 해석하여 처리할 수 있다. 쉘 스크립트에 존재하는 커맨드는 쉘 커맨드, 컴파일된 실행 프로그램 및 다른 쉘 스크립트가 가능하다. 일반 프로그램과 같이 변수 선언이 가능하고 조건문과 순환문과 같은 제어 구조를 사용할하여 작성할 수 있다.
- 리다이렉션
- 프로그램 수행을 위한 입력을 키보드(표준 입력)로부터 받지 않고 파일로부터 받도록 리다이렉션할 수 있다. 또 표준 출력이나 표준 에러를 화면으로 보내지 않고 파일로 출력하도록 리다이렉션할 수 있다.
- 쉘 스크립트 함수
- 함수는 스크립트 코드의 블록으로 이름을 가진다. 코드 블록을 재사용을 위해 함수로 정의해 두면, 스크립트 파일이나 쉘 프롬프트에서 함수 이름을 사용하여 호출할 수 있다. 함수를 정의할 때 인자를 사용할 수 있다.
요점정리
- 쉘 스크립트의 조건문이나 순환문에서 사용할 수 있는 비교 연산자, 검사 연산자, 논리 연산자, 산술 연산자는 어떤 것이 있는지 나열하고 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 ]의 의미와 동일함)
- 정수 비교 연산자
- 쉘 스크립트의 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 )
- expr 명령은 ‘expr expression’ 형태로 사용되며 ‘expr expression’의 결과값은 expression을 평가한
값이다.
- 쉘에서 사용하는 따옴표의 의미를 구분하시오.
- '…' : 안의 특수 문자를 해석하지 않음
예 : echo ' " $PATH " ' (" $PATH " 가 그대로 출력됨)
- "…" : '…'와 같으나 일부 특수 문자를 해석함
- $, \, ` 등의 특수 문자는 해석함
예 : echo " ' $PATH ' "
(겹따옴표 안에 있으므로 홑따옴표 문자가 그대로 출력되고 $ 문자는 해석되므로 홑따옴표로 둘러싸인 PATH 환경변수 값이 출력됨) - `…` 또는 $(…) : 안의 명령을 실행함. 둘러싸인 명령을 실행하는 것을 command substitution라고 함
예1 : echo " Today is `date` "
('Today is' 문자열에 이어 date 명령이 실행결과가 출력됨)
예2 : echo $( expr 3 \* 7 )
(expr 명령이 실행되어 21이 출력됨)
- '…' : 안의 특수 문자를 해석하지 않음
- 쉘의 순환문 형식은 어떤 것이 있는지 기술하시오.
- 순환문의 종류
- 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
- 형식
- 순환문의 종류
- 쉘의 조건문 형식과 비교 연산의 종류에 대해 설명하시오.
- 조건문 형식은 다음과 같다. 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보다 작거나 같다
- 조건문 형식은 다음과 같다. elif 부분은 없을 수도 있고 여러 개가 올 수도 있다. else 부분은 있어도 되고 없어도 된다.
- 쉘의 스크립트에서 함수를 정의하는 형식을 설명하시오.
- 함수
- 특정한 일을 수행하는 기능이 구현된 코드 블록
- 함수 정의
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
- 함수
연습문제
- 쉘 스크립트를 /bin/bash이 해석한다는 의미로 쉘 스크립트 파일의 첫 번째 행에 지정해야 하는 내용은?
- 정답 :
-
②
- 해설 : #!/bin/bash이 쉘 스크립트를 /bin/bash이 해석한다는 의미이다.
- 다음 중 쉘 스크립트에서 첫 번째 명령행 인수를 뜻하는 것은?
- 정답 :
-
②
- 해설 : ${1}이 첫 번째 명령행 인수를 의미한다.
- 다음의 쉘에서 사용하는 특수 문자 중 둘러싸인 내용을 전혀 해석하지 말라는 의미를 가진 것은?
- 정답 :
-
②
- 해설 : 쉘은 홑따옴표로 둘러싸인 내용을 전혀 해석하지 않는다.
(Escape 문자인 ‘\’의 경우도 해석하지 않고 ‘\’ 문자 그대로 출력함)
- 다음 쉘 스크립트를 실행했을 때의 출력은?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가 출력된다.
- 다음은 쉘의 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~"
'컴퓨터과학[3-2] > U.N.I.X' 카테고리의 다른 글
UNIX - [제12강] 네트워크 설정 및 원격 관리 (0) | 2016.07.20 |
---|---|
UNIX - [제11강] 패키지 관리 및 네트워크 개요 (1) | 2016.07.20 |
UNIX - [제9강] 프로세스 관리 명령(2) & 쉘 (0) | 2016.07.19 |
UNIX - [제8강] 프로세스 관리 명령 01 (0) | 2016.07.19 |
UNIX - [제7강] 기본 명령 (0) | 2016.07.19 |
댓글