본문 바로가기

linux

7. 쉘스크립트 작성법

728x90
반응형

7. 쉘스크립트 작성법

shell 이란 무엇인가?

"shell 이란 운영체제에서 제공하는 명령을 실행하는 프로그램이다."

 

shell 스크립트란?

"인터프리터(통역사) 역할을 하는 것으로 시스템에서 지원하는 명령어들의

집합을 묶어서 프로그램화한것을 말한다."

 

shell 종류

1. Bourne shell

2. C shell

3. Korn shell

4. bash shell

 

:

#!/bin/bash     ------>쉘중에 bash shell 을쓰겠다는 !

*1,2,3 장점을 살려놓은게 bash shell !

 

스크립트 프로그래밍이란?

1. C 언어와 유사한 프로그래밍

2. 변수, 반복문(loop), 제어문(if) 사용가능

3. 별도로 컴파일 하지 않고 텍스트 파일 형태로 바로 실행이 가능하다.

*C 자바는 컴파일해줘야 한다.(기계가 있는 언어로 바꿔줘야 한다)

4. vi gedit 으로 작성이 가능

5. 리눅스의 많은 부분이 쉘스크립트로 작성이 되어있다.

 

스크립트를 작성하고 실행하는 방법

$ vi a.sh

    echo "host name:" $HOSTNAME

 

$ sh a.sh

 

[orcl:~]$ sh a.sh

host name: edydr1p0.us.oracle.com

 

이렇게 호스트네임 수도 있구요

 

 

$ vi a.sh

  echo "yahoo~~"

 

[orcl:~]$ sh a.sh

yahoo~~~

 

***./a.sh 하려니까 실행권한 없다고 뜬다( 하려고 했는지는 모름)

 

[orcl:~]$ ls -l a.sh

-rw-r--r-- 1 oracle oinstall 17 Dec 20 11:39 a.sh

 

***보면 실행권한 x 없는걸 있다.

 

 

 

 

문제127.

a.sh 소유자가 실행할 있도록 실행권한을 넣으시오

 

[orcl:~]$ chmod u+x a.sh

[orcl:~]$ ls -l a.sh

-rwxr--r-- 1 oracle oinstall 17 Dec 20 11:39 a.sh

[orcl:~]$ ./a.sh

yahoo~~~

 

설명:

./파일명    으로 실행하려면 실행권한이 있어야 한다.

sh 파일명 .sh      파일의 실행권한이 없어도 실행된다.

 

 

****최상위계정 root 들어가서 권한설정하는 경우는

oracle 같은 하위 계정사용자에게 제한을 걸때 한다.

 

 

 

변수 사용법

1. 모든 변수는 "문자열(string)" 으로 취급된다.

2. 변수 이름은 대소문자를 구분한다.

3. 변수에 값을 대입할 때는 '=' 좌우에 공백이 없어야 한다.

4. 변수에 들어간 문자를 출력하려면 변수 앞에 $ 붙이고

    echo 명령어로 출력하면 된다.

 

:

[orcl:~]$ myvar="hi~~~~~~~~~~~"

[orcl:~]$ echo $myvar

hi~~~~~~~~~~~

 

 

 

변수의 숫자 계산하는 방법

 

1. 변수에 대입한 값은 모두 문자열로 취급된다.

 

2. 변수에 들어있는 값을 숫자로 해서 + * / - 등의 연산을 하려면

    띄어쓰기랑 expr 사용해야 한다.

 

3. 수식에 괄호 또는 곱하기(*) 사용하려면

   앞에 반드시 역슬래시(\) 붙여야한다.

 

예제:

[orcl:~]$ num1=100

[orcl:~]$ num2=200

[orcl:~]$ echo $num1

100

[orcl:~]$ echo $num2

200

[orcl:~]$ echo $num1+$num2

100+200

[orcl:~]$ expr $num1 + $num2

300

※계산하는 expr +사이에 띄어쓰기 해줘야 각각의 변수로 이해하고 연산한다.

  (붙여쓰면 하나의 문자로 인식)

 

 

문제128.

num1 num2 곱을 구하시오

3. 수식에 괄호 또는 곱하기(*) 사용하려면

   앞에 반드시 역슬래시(\) 붙여야한다.

 

[orcl:~]$ expr $num1 \* $num2

20000

 

 

 

문제129.(점심시간 문제)

아래의 계산식을 구현하시오!

($num2 + 200) * $num1

 

 

[orcl:~]$ expr \( $num2 + 200 \) \* $num1

40000

 

※괄호앞뒤로 역슬래쉬, 곱셈앞에 역슬래쉬

 

 

파라미터 변수

1. 파라미터 변수는 $0, $1, $2 .. 형태를 가진다.

2. 전체 파라미터는 $* 표현한다.

 

예제:

$ vi b.sh

 

echo "실행파일 이름은 $0 입니다"

echo "첫번째 파라미터 값은 $1 입니다"

echo "두번째 파라미터값은 $2 입니다"

echo "전체 파라미터값은 $* 입니다"

 

[orcl:~]$ vi b.sh

[orcl:~]$ sh b.sh 10 20

실행파일 이름은 b.sh 입니다

첫번째 파라미터값을 10 입니다

두번째 파라미터 값은 20 입니다

전체 파라미터 값은 10 20 입니다.

 

설명:

[orcl:~]$ sh       b.sh        10       20

                                        

                     $0          $1        $2     **전체는 $*

 

 

 

문제130.

아래와 같이 정수를 파라미터 값으로 입력했을

나눈 나머지 값이 출력되게 하시오

 

[orcl:~]$ vi f.sh

 

 

[orcl:~]$ sh f.sh 24 18

24 plus 18 and 42

 

 설명:

변수=`리눅스 명령어`

리눅스 명령어에 의해서 수행된 결과가 변수에 입력되어야 한다면

역따옴표 사용해야 한다

 

 

 

문제131.

아래의 수를 각각 물어보게하고 아래의 수를 곱한 결과가

출력되게 하시오

$ sh two_number.sh 12 54

 

 

[orcl:~]$ sh two_number.sh 12 54

12 and 54 is 648

 

 

 

리눅스 쉘에서 if 사용방법

 

if [ 조건 ]; then

    실행문

elif [ 조건 ]; then

    실행문

else

    실행문

fi

 

4 안띄어도 되고, 마지막 닫을 fi 거꾸로 쓴다.

※ if 사용시 주의 사항 !  "공백처리 잘해줘야한다."

 

 

■ if 조건문에 들어가는 비교 연산자

 

-문자열 비교

1. "문자열1"="문자열2"  :     문자열이 같으면 true

2. "문자열1"!="문자열2":     문자열이 같지 않으면 true

 

 

-숫자열 비교

1. 숫자1   -eq  숫자2 : 숫자가 같으면 true ( 판정)

2. 숫자1 -ne 숫자2 : 숫자가 같지 않으면 true (거짓판정)

3. 숫자1 -gt 숫자2 : 숫자 1 숫자 2보다 크다면 true (왼쪽 크면 )

4. 숫자1 -ge 숫자2 : 숫자 1 숫자 2보다 크거나 같다면 true (왼쪽 크거나 같으면 )

5. 숫자1 -lt  숫자2 : 숫자 1 숫자 2보다 작다면 true

6. 숫자1 -le 숫자2 : 숫자 1 숫자 2보다 작거나 같으면 true

7. !숫자1

 

 

-비교 표현식 줄임말

eq - equal ( = )

ne - not equal ( <> )

lt - little ( < )

le - little or equal ( <= )

gt - greater ( > )

ge - greater or equal ( >= )

 

 

예제:

$ vi if1.sh

 

#!/bin/bash

if [ 100 -eq 200 ]; then

echo 100 200 같다

else

echo 100 200 같지않다

fi

 

[orcl:~]$ sh if1.sh

100 200은 같지않다

 

 

 

 

문제132.

위의 스크립트를 파라미터 변수를 이용해서

아래와 같이 실행될 있게 하시오

 

$ sh if1.sh

 

$ vi if1.sh

 

 

 

 

[orcl:~]$ sh if1.sh 100 200

100 200은 같지않다

 

 

 

문제133.

아래와 같이 실행되게 쉘스크립트를 작성하시오

$ sh if2.sh 100 200

 

$ sh if2.sh 100 200

$ sh if2.sh 200 100

$ sh if2.sh 100 100

 

 

리눅스에서 사용하는 연산자

리눅스의 연산자 3가지

1. 산술 연산자: + , -, *, /

2. 비교 연산자: >, <, >=, <=, ==, !=

3. 논리 연산자: &&, ||, !

 

논리 연산자인 and && 또는 -a 사용한다.

논리 연산자인 or || 또는 -o 사용한다.

 

 

eq - equal ( = )

ne - not equal ( <> )

lt - little ( < )

le - little or equal ( <= )

gt - greater ( > )

ge - greater or equal ( >= )

 

 

예제:

if [ $sal -lt 2000 ] && [ $job=="SALESMAN" ]; then

또는

if [ $sal -lt 2000 -a $job=="SALESMAN" ]; then

 

 

문제134.

아래와 같이 쉘스크립트를 실행하면 아래와 같은 결과가 출력되게 하시오!

 

$ sh find_sal.sh scott

scott 월급은 3000 입니다

 

$ vi find_sal.sh

sal=`grep -i $1 emp.txt | awk '{print $6}'`

echo $1 s salary is $sal

 

[orcl:~]$ sh find_sal.sh scott

scott salary is 3000

 

 

문제135.

아래와 같이 실행했을 해당 사원의 부서번호가 30번이고

월급이 2000  보다 작다면

"월급 인상 대상자 입니다"

라는 메시지가 나오게 하고

그렇지 않으면

"월급 인상 대상자가 아닙니다" 라는 메시지가 나오게 하시오

 

결과:

$sh find_sal.sh scott

월급 인상 대상자가 아닙니다

 

$ sh find_sal.sh martin

월급 인상 대상자 입니다

 

$ vi find_sal.sh

 

다른 if

if [ $deptno -eq 30 -a $sal -lt 2000 ]; then

 

[orcl:~]$ sh find_sal.sh scott

this person is being same salary

 

[orcl:~]$ sh find_sal.sh martin

this person needs ascending salary

 

 

loop

*for loop 문법

 

for 변수 in {1,2,3}

do

    반복할 문장

done

 

예제:

$ vi for.sh

 

hap=1

 

[orcl:~]$ sh for.sh

from 1 to 10 plus is 55

 

 

 

문제136.

위의 코드를 수정해서 구구단 2단을 출력하시오!

 

$ vi for2.sh

 

[orcl:~]$ sh for2.sh

2x1=2

2x2=4

2x3=6

2x4=8

2x5=10

2x6=12

2x7=14

2x8=16

2x9=18

 

 

 

문제137.

구구단 2단부터 9단까지 출력하시오!

 

$ vi for2.sh

 

 

 

 

문제138.

아래의 별표를 출력하시오

$ sh star.sh

 

@

 

파이썬 처럼 문자와 숫자의 곱으로 생각하면 안됨.

변수에다 넣어서 나열한다 생각해야 .

 

[orcl:~]$ sh star.sh

@

@@

@@@

@@@@

@@@@@

 

 

 

eval

"eval 명령어는 문자열을 명령문으로 인식하고 실행하는 명령어"

:

$ eval echo {1..10}

1 2 3 4 5 6 7 8 9 10

 

**변수를 끌어와서 명령문으로 인식시키려면

num=6

for i in `eval echo { 1..$num}`

 

 

 

문제139.

위의 코드를 수정해서 숫자를 물어보게하고

숫자를 입력하면 해당 숫자만큼 @ 출력되게 하시오!

 

$ vi star2.sh

 

 

 

숫자를 입력하세요~ 6

 

 

[orcl:~]$ sh star2.sh

put your number in here: 6

@

@@

@@@

@@@@

@@@@@

@@@@@@

 

 

 

문제140.(오늘의 마지막 문제)

숫자를 물어보게 하고 아래와 같이 결과가 출력되게 하시오

 

$ sh star2.sh


힌트
: for ((i=10; i>0; i--))

           do

              echo $i

           done

 

**힌트 사용한거

 

 

**힌트 사용 안하고 기존 방법

 

 

[orcl:~]$ sh star2.sh

put your number in here: 6

@@@@@@

@@@@@

@@@@

@@@

@@

@

 

 

echo -n "put your number in here: "

read num

star=""

for i in `eval echo {$num..1}`

    do

    for j in `eval echo {$i..1}`

        star="$star@"

        done

    echo $star

    star=""

done

 

 

 

 

728x90
반응형