728x90

출처 : http://blog.naver.com/akrthwn?Redirect=Log&logNo=140017739530
shell programming에 대한 자료가 많이 있다. 참고할 것
x box로 표시된 그림들은 어차피 내용과 상관없는 아이콘들이다. 일일이 지우고 다시 표시해주기 귀찮아 그냥 복사해뒀다.

변수의 정의

 Shell에서 사용되는 변수는 문자, 숫자, _(언더바)로 구성될 수 있지만, 시작은 반드시 문자나 _로 시작

 Shell에서 사용되는 변수의 모든 값은 문자열로 처리되기 때문에 따로 유형을 선언해 줄 필요가 없다

 정의되지 않은 변수의 초기값은 널(Null) 문자열

 Shell에서 사용되는 변수는 3가지로 나눌 수 있다.

   사용자 정의 변수(지역 변수) : 사용자가 임의로 지정해서 사용하는 변수

   시스템 정의 변수(환경 변수) : Shell이 자동적으로 지정하는 변수, 사용자는 참조만 가능

   특수 변수(인자 변수) : Shell이 특수하게 해석하는 변수


 변수 대체

 name=value : 변수 name에 value라는 값을 할당

 $name : 변수 name에 입력된 값을 호출

 변수에 문자열을 사용할 경우 작은 따옴표(' ')를 이용하여 문자열을 둘러싸면 됨

 readonly : 더 이상 변수의 값을 다시 할당할 일이 없을 때 사용


▼ [변수 대체의 예]

[root@linuxone root]# name='redhat linux'  // name이라는 변수에 'redhat linux'라는 값을 할당
[root@linuxone root]# echo $name            // echo 명령어를 이용하여 name에 할당된 값 호출
redhat linux
[root@linuxone root]# name=apple            // 다시 name이라는 변수에 apple이라는 값 할당
[root@linuxone root]# echo $name           // echo 명령어를 이용하여 name에 입력된 값 호출
apple
[root@linuxone root]# readonly name        // readonly 명령어를 이용하여 더 이상 name이라는
                                                            // 변수에 값이 할당되지 못하도록 설정
[root@linuxone root]# echo $name           // echo 명령어를 이용하여 name에 입력된 값 호출
apple
[root@linuxone root]# name=tomato          // name이라는 변수에 tomato 라는 값을 할당하면
bash: name: readonly variable                 // 더 이상 값을 할당할 수 없다는 메시지를 출력
[root@linuxone root]#


 변수연산자

${varname}

   varname에 해당하는 변수 치환이 이루어짐

${varname:=value}

   varname의 값이 null이면 value를 값으로 할당

   만약 varname의 값이 null이 아니면 기존의 값을 그냥 사용

[root@linuxone root]# echo $profile
 
[root@linuxone root]# echo ${profile:='linux man'}
linux man
[root@linuxone root]# echo $profile
linux man
[root@linuxone root]#

${varname:+value}

   varname의 값이 null이 아니면 value 값을 할당

   만약 varname의 값이 null이라면 value의 값을 varname에 할당하지 않음

      

'linux'의 변수 값으로 'redhat'이라는 값이 할당되어 있기 때문에 '${linux:+kernel}' 구문에서 'kernel'이라는 값을 할당하더라도 실질적인 'linux'의 값으로는 여전히 'redhat'이라는 값이 할당되어 있음
 
[root@linuxone root]# linux=redhat
[root@linuxone root]# echo $linux
redhat
[root@linuxone root]# echo ${linux:+kernel}
kernel
[root@linuxone root]# echo $linux
redhat
[root@linuxone root]#
 
만약 변수 'linux에 값이 할당되어 있지 않으면 'redhat'이라는 새로운 값을 여전히 할당하지 않는다.
 
[root@linuxone root]# echo $linux
[root@linuxone root]# echo ${linux:+kernel}
redhat
[root@linuxone root]# echo $linux
[root@linuxone root]#

${varname:-value}

   varname의 값이 null이라면 기존의 값을 그냥 사용

   만약 varname의 값이 null이 아니라면 value의 값을 varname에 할당하지 않음

'MR' 이라는 변수에 값이 할당되어 있지 않기 때문에 기존의 값(null)을 그대로 사용함
 
[root@linuxone root]# echo $MR
[root@linuxone root]# echo ${MR:-MISS}
MISS
[root@linuxone root]# echo $MR
 
[root@linuxone root]#
 
하지만, 'MR'이라는 변수 값으로 'Hong'이 할당되어 있지만 새로운 값 'gil'로 바꿔지지 않는다. 즉, '${varname:-value}'는 varname에 할당되어 있는 값(null 일 수도 있고, 아닐 수도 있다)를 그냥 사용한다고 할 수 있다.
 
[root@linuxone root]# echo $MR
Hong
[root@linuxone root]# echo ${MR:-gil}
Hong
[root@linuxone root]# echo $MR
Hong
[root@linuxone root]#

${varname:?value}

   varname의 값이 null이면 value의 값을 오류 메시지로 출력하고 프로그램을 종료


'MONTH'라는 변수에 값을 할당하지 않았기 때문에 에러 메시지로 새로 입력되는 값인 'november'를 출력함. 그러나 여전히 'MONTH'라는 변수가 값을 가지고 있지 않음
 
[root@linuxone root]# MONTH=" "
[root@linuxone root]# echo ${MONTH:?november}
bash: MONTH: november
[root@linuxone root]# echo MONTH
 
[root@linuxone root]#
 
만약, 'MONTH'라는 변수에 'december'를 값으로 할당한다면 여전히 할당된 값(december)을 사용하고 있다.
 
[root@linuxone root]# MONTH=december
[root@linuxone root]# echo $MONTH
december
[root@linuxone root]# echo ${MONTH=?november}
december
[root@linuxone root]# echo $MONTH
december
[root@linuxone root]#


 주석문

 Shell 프로그램에서 "#" 기호 뒤에 있는 모든 부분을 지칭

 새로운 행으로 가면 주석문이 끝나므로 계속해서 주석문을 사용하려면 새로운 행에 "#" 기호를 써주어야 함

 명령어의 오른쪽에도 주석문이 사용될 수 있는데, "#" 기호 앞에는 적어도 하나 이상의 공백문자나 tab이 존재해야 함


 배정문

 varname="string" 또는 varname=$varname2

 변수에 대한 배정문은 "=" 문자를 사용

 Bourn Shell에서는 "=" 문자의 앞뒤에 공백문자나 tab이 없어야 하지만 C Shell의 경우에는 허용이 됨

 변수명은 첫 자가 특수문자가 아닌 영문이나 숫자이어야 하고, 연속된 문자열이어야 함

 두 개 이상의 단어를 묶어서 지정하려면 반드시 " "를 사용


 인용처리

 $ 변수 표현을 이중 인용부초(" ") 문자로 묶으면 변수는 변수의 값으로 대체

 $ 변수 표현을 단일 인용부호( ' ') 문자로 묶으면 아무런 대체 과정도 일어나지 않고 단일 인용부호에 의해 둘러싸인 모든 문자열을 하나의 인수와 같이 취급

 $ 변수 앞에 문자를 붙이면 $의 특별한 의미는 무조건 제거

 역 인용부호(``)는 매우 특이하게 사용되는데 역 인용부호 내의 내용은 shell에 의해 실행되고 그 결과가 역 인용부호가 있었던 위치에 치환


 환경변수

 사용자가 사용하게 될 환경(로그인 한 후 사용하게 될 환경)에 저장되어 있는 변수

 Shell Script가 실행될 때, 여러 변수의 값이 기존의 환경으로부터 초기화 되는데 이 변수들은 보통 대문자로 표시된다 - 사용자의 정의 변수와 구별하기 위해서임

 사 용자 정의 변수는 소문자를 많이 사용하는데, 만들어지는 변수는 사용자의 개인적인 설정에 따라 다르다. 이러한 환경 내용에는 단말기의 종류와 속성, 로그인 사용자, 호스트 이름, 쉘이 사용할 명령어의 경로, 전자우편을 전송할 경로, 로그인 홈 디렉토리 등의 내용이 들어있다.

사용자 삽입 이미지
 

 지역변수

 쉘이 자식 쉘을 생성해서 명령을 실행하면, 부모 쉘에서 사용하던 쉘 변수들을 모두 사용할 수 없게 됨

 현재 쉘에 국한되어 사용되어지는 변수

 사용자가 직접 생성한 변수는 모두 지역 변수

 set : 현재의 지역 쉘 변수를 확인하는 명령어

 unset : 지역 변수를 없애는 명령어

사용자 삽입 이미지
 

 export

 단순히 지역 변수로 만들어진 변수를 환경 속으로 전송하게 함

 환경 속으로 지역 변수를 전송하는 것은 지역 변수로 정의된 변수가 다른 프로세서에서 사용될 수 있도록 하기 위해서 로컬 데이커의 공간에서 환경 데이터의 공간으로 전송하는 것을 의미


 기타 변수 - 인자변수

 특별한 용도의 내장 변수들

사용자 삽입 이미지


 프롬프트 지정 변수 PS1 : 명령 대기 상태를 알리는 쉘 프롬프트의 모양을 사용자 임의로 만들 수 있는 변수로 여러 기호와 함께 사용되어 쉘 프롬프트의 다양한 출력 모양을 만들어 낼 수 있다.

사용자 삽입 이미지
 
728x90

+ Recent posts