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
728x90
 test와 [ ] 명령

 식을 평가하고 그 식에 대한 논리값을 반환
 표현식 test expression 또는 [expression]

 식의 값이 true 일 때는 0을 반환하며, false 일 때는 0이 아닌 값(일반적으로 1)을 반환

 test 명령어는 숫자, 문자열, 파일들의 상태를 평가할 수 있다

 [ 와 ] 의 주변에는 반드시 공백이 필요


 test 구문에서 사용되는 연산자

 논리부정 연산자(NOT) : 다른 연산자와 함께 하용되며 파일 test에 이용 ( 표현식 : ! )

 괄호(GROUPING) : 실행순서를 변경하기 위해 사용하며 괄호의 양쪽에는 공백 필요

                              (표현식 : □( □ ) )

 논리곱 연산자(AND) : 표현식 -a

 논리합 연산자(OR) : 표현식 -o

 연산자 우선순위 : 괄호 > 논리부정 연산자 > 논리곱 연산자 > 논리합 연산자


사용자 삽입 이미지
728x90

'Programming > linux왕초보' 카테고리의 다른 글

grep 사용하기  (1) 2011.07.29
어셈 명령어 정리  (1) 2011.03.22
linux 병렬포트(프린트포트) 제어  (0) 2008.10.13
리눅스 버젼확인은 어찌하나요???;;  (0) 2008.09.12
shell programming - 변수  (0) 2008.09.11
shell programming - 제어문  (0) 2008.09.11
shell programming - 반복문  (0) 2008.09.11
shell programming - 목록과 함수  (0) 2008.09.11
shell programming - 명령 실행  (0) 2008.09.11
shell programming  (0) 2008.09.11
728x90
 if 문

 if 문은 명령의 결과를 테스트하여 조건적으로 적절한 구문 그룹을 실행
 표현식

   if condition

   then

              command1

   else

              command2

   fi

 실행 순서

   - if 문은 condition에 있는 명령어를 순차적으로 실행

   - 만약 condition의 종료값이 참이라면 command1을 실행

   - 그렇지 않으면 command2를 실행

 예시

① {예제1}
     $vi sample1
     #!/bin/sh
     echo " 읽어들인 파일의 이름 ?" ; read var
     if [ -f $var ]
     then
             echo file
     else
             if [ -d $var ]
             then
                    echo directory
             else
                    echo "not found"
            fi
     fi
     $chmod +x sample1
     $./sample1
     읽어들인 파일의 이름 ?
     /etc/passwd
     file
② {예제2}
     $vi sample2
     #!/bin/sh
     if test -z "$1"
     then
             echo usage:sample2 filename
     fi
     file_size='wc -c < $1'
     echo the file size is $file_size charactors
     if test $file_size -le 5120
     then
             echo the file $1 is a smail file
     else
             echo the file $1 is a large file
     fi
     $chmod +x sample2
     $./sample2
     usage:sample2 filename
     $./sample2 /etc/passwd
     the file size is 3457 charactores
     the file /etc/passwd is a smail file
 
③ {예제3}
     $vi sample3
     if test $# -ne 2
     then
                echo usage:$0 pattern file >&2
                exit 1
     fi
     if grep $1 $2 > /dev/null
     then
                echo grep found what it was looking for
     else
                echo grep cound not find the pattern
     fi
     $chmod +x sample3
     $./ddd
   


 elif 문

 elif 문을 사용하여 여러 조건을 검사

 표현식

    if condition1

    then

               commands1

    elif condition2

    then

               commands2

    else

               commands3

    fi


① {예제1}
     $vi sample4
     #!/bin/sh
     echo "are you man? (yes/no)"; read $var
     if [ -f $var = "yes" ]
     then
             echo "you are man"
     elif [ "$var" = "no" ]
     then
             echo "you are woman"
     else
             echo "enter yes or no"
     fi
     $chmod +x sample4
     $./sample4
     are you man?  (yes/no)
     yes
     you are man
   


 case 문

 여러 패턴을 검사하고 이에 적절한 구문을 실행

 표현식

    case variable in

             pattern1 | pattern .... ) command1;;

             pattern2 | pattern .... ) command2;;

             ...

             *)        commandx;;

    esac

 오른쪽 괄호와 세미콜론은 반드시 필요

 사용자는 원하는 만큼의 pattern 나열이 가능

 각 pattern 위에 따르는 command들 뒤에는 ;; 기호가 반드시 필요

① {예제1}
     $vi sample5
     #!/bin/sh
     echo "*********************************"
     echo "* 보기                            *"
     echo "1.who   2.date   3.pwd   4.ls -l    *"
     echo "*********************************"
     echo "수행하고자 하는 명령어는 ? (번호) "
     read number;
     case $number in
                  1)
                  2)
                  3)
                  4)
                  *)
     esca
     $chmod +x sample sample5
     $./sample5
     *********************************
     * 보기                            *
     *********************************
     1.who   2.date   3.pwd   4.ls -l   *
     *********************************
     수행하고자 하는 명령어는 ? (번호)
     1
     test  pts/0     Jul  8  13:06
 
 
 
② {예제2}
     $vi sample6
     #!/bin/sh
     echo "is it morning ? (yes/no)"
     read ans;
     case "$ans" in
                     yes | y | Yes | YES)        echo "good morning";;
                     no | n | No | NO)             echo "good afternoon";;
                     *)                                   echo "answer not recognize";;
     esac
     $chmod +x sample6
     $./sample6
     is it morning? (yes/no)
     yes
     good morning
   


 기타 제어 명령어

 정상적인 종료 이전에 루프를 멈추고자 할 때 사용

 break [n] : n번 반복한 후 루프에서 빠져나옴

 continue [n] : 나머지 명령을 무시하고 루프에서 처음으로 복귀

 exit [n] : 나머지 명령을 무시하고 프로그램을 완전히 종료


                              ▼ [Shell 프로그래밍에서 사용하는 종료 코드]
0 : 성공
1~125 : 에러
126 : 파일실행불가
127 : 명령을 찾을 수 없음
128이상 : 시그널발생

728x90

'Programming > linux왕초보' 카테고리의 다른 글

어셈 명령어 정리  (1) 2011.03.22
linux 병렬포트(프린트포트) 제어  (0) 2008.10.13
리눅스 버젼확인은 어찌하나요???;;  (0) 2008.09.12
shell programming - 변수  (0) 2008.09.11
shell programming - 제어문  (0) 2008.09.11
shell programming - 반복문  (0) 2008.09.11
shell programming - 목록과 함수  (0) 2008.09.11
shell programming - 명령 실행  (0) 2008.09.11
shell programming  (0) 2008.09.11
shell programming - 명령어  (0) 2008.09.11
728x90
for 문
 지정된 범위 안에서 루프를 돌리는데 사용

 범위에 사용되는 값은 어떤 문자열의 집합이라도 가능

 표현식

   for variable in value_list

   do

           command

   done

 실행순서

   - variable 에 value_list의 첫 번째 단어가 지정

   - command가 실행

   - command가 끝나면 다시 variable에 value_list의 두 번째 단어

   - value_list의 단어들이 다 사용될 때까지 진행

① {예제1}
     $vi sample1
     #!/bin/sh
     for var in *
     do
             file_size='wc -c < $var'
             echo $var contains $file_size charaters
             if test $file_size -le 5120
             then
                          echo the file $var is a small file
             else
                          echo the file $var is a large file
             fi
     done
     $chmod +x sample5
     $./sample5
     sample5 contains 209 charaters
     the file sample5 is a small file
   


 while 문
 for 문으로 어떤 명령을 지정한 횟수만큼 실행시키기가 어려울 경우에 사용

 표현식

   while condition

   do

           command

   done

 실행순서

   - while과 do 사이의 command에서 되돌려주는 명령어의 종료 상태 값이 참인 경우에만 do와 done 사이의 command를 수행

   - 순환을 계속하다가 condition의 종료 상태값이 거짓인 경우에는 순환을 종료

   - 반환값이 참인 동안 계속 수행하므로 반환값이 항상 참일 경우에는 무한루프에 빠진다

① {예제1}
     $vi sample2
     #!/bin/sh
     count=1
     while [ $count -le 5 ]
     do
                   echo $count
                   count='expr $count + 1'
     done
     $chmod +x sample2
     $./sample2
     1
     2
     3
     4
     5
 
② {예제2}
     $vi sample3
     #!/bin/sh
     while [ $# -gt 0 ]
     do
                   echo "$# : $*"
                   shift
     done
     $chmod +x sample3
     $./sample3 1 2 3 4 5
     5 : 1 2 3 4 5
     4 : 1 2 3 4
     3 : 1 2 3
     2 : 1 2
     1 : 1
 
③ {예제3}
     $vi sample4
     #!/bin/sh
     echo $#
     echo $1
     echo "----------------------------"
     shift 2
     echo $#
     echo $1    
     $chmod +x sample4
     $./sample4 starting shell programing !
     4
     start
     ----------------------------
     2
     programming
   


 until 문
 while문과 비슷하지만 condition이 거짓일 동안만 실행

 표현식

   until condition

   do

           command

   done

① {예제1}
     $vi sample5
     #!/bin/sh
     until who | grep "$1" > /dev/null
     do
                   sleep 100
     done

728x90

'Programming > linux왕초보' 카테고리의 다른 글

linux 병렬포트(프린트포트) 제어  (0) 2008.10.13
리눅스 버젼확인은 어찌하나요???;;  (0) 2008.09.12
shell programming - 변수  (0) 2008.09.11
shell programming - 제어문  (0) 2008.09.11
shell programming - 제어문  (0) 2008.09.11
shell programming - 목록과 함수  (0) 2008.09.11
shell programming - 명령 실행  (0) 2008.09.11
shell programming  (0) 2008.09.11
shell programming - 명령어  (0) 2008.09.11
crontab 사용  (0) 2008.09.11

+ Recent posts