쉘 프로그래밍 - 1

2021. 5. 20. 21:17

1. 쉘명령어 실행과정

쉘은 명령어 접수 - 명령어 해석 - 명령어 실행 순으로 이루어지며, 일반적으로 '접수  - 해석' 단계는 자기 자신이 수행하고 '명령어 실행' 단계는 자식 프로세스(서브 쉘)가 수행한다.(보통 exec함수를 사용) 해당 명령어의 실행 결과는 부모 프로세스에게 리턴하며, 콘솔 창(프롬프트)을 통해 사용자에게 결과 값을 시현한다.

 

2. 명령어 다중실행

연속실행: A; B

백그라운드 실행: A& B

명령어의 연휴(파이프라인): A | B

그룹화: (A; B)

 * 그룹화를 하게되면 해당 그룹을 서브 쉘에서 수행하기 때문에 현재 쉘 환경을 변화시키지 않는 특징이 있다.

     ex) 부모프로세스(로그인쉘): () 해석 -> 자식프로세스(서브쉘): A;B 해석 -> 손자프로세스: A, B 명령어 실행(2개의 명령어 각각의 손자프로세스로 실행됨)

 * 반대로 서브쉘이 아닌 현재 쉘에서 명령어를 실행시키는 방법은 '8) 쉘스크립트를 서브쉘이 아닌 현재 쉘에서 실행시키기'를 참조한다.

 

3. 쉘 스크립트

1) 정의: 명령어를 파일에 등록한 것

2) 쉘스크립트에서 병수명 정의

  A = B * A: 변수명, B: 변수 값(디렉토리 경로 등)

  ex) aa.sh 파일의 내용

        #!/bin/bash 

        echo name:

        read NAME

        echo $NAME

     -> sh aa.sh 명령으로 실행

 

3) 명령어 출력 결과를 변수에 정의하는 방법

 A = 'B' ->echo A 입력 시 B명령어의 실행결과가 출력됨

 A = B ->echo A 입력 시 B 단어 그대로가 출력됨

 

4) 등록된 쉘변수 해제법

 unset 등록된 쉘변수명

 

5) 인용부에 의한 참조

  공백이나 메타캐릭터가 포함된 문자열은 변수나 명령의 인수로 이용하고자 할 경우 사용

  종류

    단일인용부 : *

       단일인용부 내의 문자상의 !, \ 는 메타문자로 해석되며, 그외의 메타문자는 해석되지 않는다.

    이중인용부 : "

       이중인용부 내의 문자상의 !, \, $, '는 메타문자로 해석된다.

    역인용부 : '

       명령의 실행결과를 변수에 정의한다.

 

6) 위치 파라미터

 쉘 스크립트 실행시 명령어와 인수(매개인자)를 구분하는 파라미터이다.

   $0 : 쉘 명령어

   $1 : 첫번째 인수

   $2 : 두번째 인수

   ...

   $* : 인수전체, echo $*를 실행시 전체 인수를 출력

   $# : 명령어 실행시 받은 전제 인수의 개수

 

 * shift [n]

     n+1번째 인수를 1번째 인수가 되게 shift한다. 그냥 shift만 입력시 'shift 1' 명령을 입력한 것으로 간주한다.

 * 파라미터 값 재정의

     위의 shift 명령어 사용시 shift되어 사라진 인수는 참조가 불가능하다.

     이런 변수참조를 위해 해당인수를 따로 저장 후, 해당인수로 파라미터 재정의가 가능하다.

       ex) aa.sh 내용

          #!/bin/bash 

          echo $*

          v = $*

          shift 2

          echo $*

          set $v

          echo $*

 

 * set [flag] [arguments]

     flag, arguments 부재시 현재 설정된 쉘변수를 출력한다.

     flag 종류

       -n(+n) : 명령어를 읽고 실행하지 않는다(실행한다)

       -x(+x) : 명령어와 인수를 실행시 표시한다(표시하지 않는다)

       -- : 어느 플래그도 변경하지 않는다

    ex) set '명령어' -> 명령어의 실행결과를 설정

         set $변수명 -> 쉘변수의 값 설정

 

7) 쉘간 변수전달

쉘간의 변수를 주고 받기위해 해당변수를 환경변수로 정의한다.

먼저 변수를 정의 후, 해당변수를 환경변수로 정의하면 되는데, (이때 해당변수는 환경변수 리스트에 저장된다.) 이때 자식 쉘, 자식 프로세스에서 해당변수를 환경변수로서 인식할 수 있다.

 

8) 쉘스크립트를 서브쉘이 아닌 현재 쉘에서 실행시키기

스크립트에 실행권한을 부여 후 도트(dot) 실행한다.

 ex) aa.sh 구성

        echo $a

        echo $b

     chmod 777 aa.sh

     현재 로그인 쉘 창에 아래의 내용을 입력

       a=1

       b=2

     아래의 명령을 실행

       ./aa.sh -> 2출력

       . ./aa.sh -> 1, 2출력

       . aa.sh -> 1, 2출력

       . sh aa.sh -> 에러

       sh . aa.sh -> 에러

 

9) 로그인 계정의 쉘 변수 저장경로

아래의 변수들은 시스템 부팅 시 자동등록된다.

전체 계정 : /etc/ 경로의 .profile 유형의 파일들(ex: profile, .login)

개별 계정 : 개별 홈디렉토리(~)의 .profile 유형의 파일들(ex: .bashrc, .bash_profile)

시스템이 관리하는 쉘변수 : /etc/rcS.d, /etc/rc1.d, /etc/rc2.d 등

 

 

 

 

 

'Study > Shell' 카테고리의 다른 글

쉘 스크립트 - 4  (0) 2021.07.19
쉘 스크립트 - 3  (0) 2021.06.23
쉘 스크립트 - 2  (0) 2021.06.06
쉘 스크립트 - 1  (0) 2021.06.02
책으로 공부시작  (0) 2021.06.01

+ Recent posts