프로그래밍 환경과 프로그래밍 툴

주성식 / liks@doit.ajou.ac.kr

 

 

리눅스에서의 프로그래밍 환경

    리눅스에서는 MS의 도스 시절부터 지금의 윈도우 기반에서 사용할 수 있는 대부분의 프로그래밍 언어와 유닉스 기반에서 사용할 수 있도록 제작되어진 거의 모든 언어와 툴들을 지원한다. 가장 인기 있는 언어인 ‘C’,’C++’을 완벽히 지원하며(리눅스가 ‘C’로 짜여져 있음을 생각해 보자. ^^;) 선풍적인 인기를 끌고 있는 썬의 자바, 예전에 인기 있던 포트란, 코볼 등도 완벽히 지원한다. 최근 들어서 일상의 일부가 되어 버린 WWW (World Wide Web)의 개발 도구인 ‘perl’ 과 PHP 등의 활약도 리눅스의 도움이 컸으리라 생각한다.

    이번 글의 목적은 리눅스에서 사용할 수 있는 프로그래밍 도구들의 간략한 사용법과 여러 프로그래밍 언어들에 대해서 간략히 알아보는 것이다. 처음 부분에는 리눅스에서 사용할 수 있는 각 언어에 대한 컴파일러나 인터프리터, 혹은 프로그래밍 도구의 간략한 사용법에 대해서 다루려 한다. 끝 부분에는 유닉스계열의 운영체제에서 아주 필수적인 쉘(shell) 스크립트에 대해서 알아 보도록 하겠다. 쉘 스크립트는 여러분이 리눅스를 감칠맛 나게 활용할 수 있도록 해줄 것이다. 우리는 이 부분을 간단한 예제를 들어서 쉽게 알아 보도록 하겠다. . 실질적인 각 언어에 대한 프로그래밍은 여러분들의 관심 여하에 따라 좋은 입문서를 선택하여 공부할 수 있을 것이다.

 

리눅스에서의 ‘C’언어

    리눅스와 같은 유닉스 계열 환경에서 ‘C’는 뗄래야 뗄 수 없는 독보적인 존재이다. 또 가장 ‘Popular’한 랭귀지 인데다가 최근에 새로 개발되어 지고 있는 언어들의 모체가 되고 있는 더 이상 말이 필요 없는 기본적인 프로그래밍 언어이다.

 

‘C’언어를 사용하려면..

    우리가 ‘C’언어를 이용해 프로그램의 소스를 만들면 그것을 사람의 입장이 아닌 기계 입장의 바이너리 코드로 만들어주는 프로그래밍 도구가 필요하다. 리눅스에서의 프로그래밍 개발에는 기본 적으로 컴파일러와 라이브러리 , 헤더 파일 등을 갖추고 있어야 한다. 우리가 리눅스에서 ‘C’언어를 이용해 프로그래밍하기 위해서는 ‘GNU C Library’(glibc-2.1)라는 것이 기본적으로 필요하다. 이 라이브러리는 가장 기본적인 ‘C’라이브러리이다. 또 개발하려는 소프트웨어의 용도에 따라 여러 가지 라이브러리들을 필요로 할 것이다.

 

‘gcc’사용하기

    gcc는 GNU 프로젝트에 의해서 개발되어진 ‘GNU C Compiler’이다. ‘gcc’는 어떻게 설치해야 할까?! 적어도 리눅스에서 만큼은 ‘gcc’의 설치에 대해서 걱정할 필요는 없다. ‘gcc’는 가장 기본적인 ‘프로그램’ 이기 때문에 필수적으로 설치되기 때문이다. 만약의 경우 ‘gcc’를 설치해야 한다면 ‘http://www.gnu.org’ 등에서 다운로드 받을 수 있다.
    간단한 프로그램을 작성한 후에 ‘gcc’를 이용해서 컴파일 해보도록 하자.
     

    #include <stdio.h>
    main ()
    {
              printf(“hello,world\n”);
    }

     

    우리는 위와 같은 소스 코드를 ‘vi’ 에디터나 ‘cat’명령어와 리다이렉션 기호를 이용하여 만들 수 있을 것이다. 파일 이름은 ‘hello.c’라고 하자. 확장자가 ‘.c’가 아니면 gcc는 ‘C’언어 소스 코드임을 인식하지 못한다. 소스 코드를 컴파일 해보도록 하자.
     

    22% liks@Hero:~/programming/test> gcc hello.c
    23% liks@Hero:~/programming/test> ls -l
    합계 6
    -rwx--x--x 1 liks liks 4681 3월 8 21:17 a.out
    -rw-r--r-- 1 liks liks 57 3월 8 21:17 hello.c
    24% liks@Hero:~/programming/test> ./a.out
    hello,world
    25% liks@Hero:~/programming/test>

     

    gcc [소스코드파일이름]을 실행하면 다음과 같이 기본적으로 ‘a.out’이라는 실행코드를 생성하게 되는데 우리가 원하는 파일이름을 얻기 위해서는 다음과 같이 ‘-o’ 옵션을 줄 수 있다. ‘gcc -o hello hello.c’ ‘o’옵션은 주어진 이름으로 실행 파일을 생성하라는 ‘Place the output into <file>’의 의미를 가지고 있다.
    ‘gcc’를 사용하는데 필요한 기본적인 옵션들을 알아 보도록 하자.
     

    옵션

    기능

    -o

    사용자가 원하는 이름의 실행 파일 생성

    -M

    'Makefile'을 생성시켜 준다.

    -O

    실행 코드를 최적화 시켜준다.

    -g

    디버거를 사용할 수 있는 코드를 포함 시켜준다.

    -v

    컴파일러에 의해서 컴파일되는 과정을 보여준다.

    -c

    소스 파일로부터 목적 코드만을 생성하여 준다.

    -S

    어셈블리(Assembler) 소스 코드를 생성해 준다.

     

    프로그램을 제작할 때 컴파일을 하고 소스를 관리하는데 편의를 두기 위해 ‘make’, ‘Makefile’ 등의 유틸리티와 CVS등의 프로그램들을 사용한다. 전문 개발자가 아니라면 이러한 부분까지는 신경쓰지 않아도 된다.

 

리눅스에서 자바를 사용해 보자.

    자바에 대한 소개 : 자바는 ‘SUN Micro Systems’에서 개발되어진 컴퓨터 언어이다. 초기에는 가전 제품에 사용되어질 목적으로 설계되었으나 자바 가상 머신을 이용하여 멀티 플랫폼에서 같은 모습으로 동작하는 것이 가능하게 되었다. 어느 곳에서든지 한번 작성하게 되면 다른 포팅과 같은 과정을 거치지 않고 곧바로 실행할 수 있다는 것은 자바의 가장 강력한 기능이다. 모든 것이 완벽한 객체지향으로 설계되어졌고 인터넷에 가장 잘 맞는 언어이다.

JAVA를 위해 JDK를 설치하고 사용해 보자.

    우선 자바를 이용하기 위해서는 ‘JDK(Java Development Kit)’를 설치하여야 한다. ‘JDK’의 최신 버전을 구할 수 있는 곳은 ‘http://www.blackdown.org’이다. 이 곳에 접속하여 가까운 미러 사이트를 선택해서 JDK를 다운로드 받도록 하자. 현재 JDK의 가장 최신 버전은 1.2.2이다.

    다음의 미러 사이트에서 ‘ftp://ftp.lab.kdd.co.jp/Linux/java-linux/JDK-1.2.2/i386/rc4/’
    ‘jdk-1.2.2-RC4-linux-i386-glibc-2.1.2.sh’ (21.4MB)를 다운로드 받아 오도록 하자. 확장자가 ‘sh’로 끝나는 파일을 다운로드 받아 오는 이유는 설치가 간편하기 때문이다. 쉘스크립트처럼 실행 옵션을 주면 자동으로 설치가 된다.

 

JDK1.2.2를 설치하기

    일단 ‘su’를 사용해 루트 권한을 얻은 후 ‘jdk-1.2.2-RC4-linux-i386-glibc-2.1.2.sh’ 파일을 /usr/local/ 디렉토리에 카피한다. 카피한 후 다음과 같은 절차로 인스톨 한다.

    % cd /usr/local
    % chmod +x ./jdk-debug-1.2.2-RC4-linux-i386-glibc-2.1.2.sh
    % ./jdk-debug-1.2.2-RC4-linux-i386-glibc-2.1.2.sh

    이제는 이곳에 ‘jdk-debug-1.2.2-RC4-linux-i386-glibc-2.1.2.sh’가 자동 압축 풀림으로 설치가 된다. 설치가 완료되면 ‘JDK’를 사용하기 위해서 /etc/profile등에 ‘JDK’의 실행 경로를 패스에 잡아 주어야 한다. 다음과 같은 내용을 끝 부분에 삽입 시켜 주자.

    ‘export PATH=$PATH:/usr/local/jdk1.2.2/bin’
    새로운 환경 설정을 적용 시키기 위해서 ‘source’,’.’ 명령어 등을 이용해서 ‘/etc/profile’의 내용을 업데이트 시켜준다. ‘% source /etc/profile’ 이제 JDK를 사용할 수 있는 모든 준비는 끝났다. 간단한 예제를 컴파일해 보도록 하자.
    (헬로 월드를 엑스 윈도우 화면에 출력하는 프로그램)
     

    import java.awt.*;
    public class HelloWindow extends Frame {

                HelloWindow(String title) {
                            super(title);
                }
                public static void main(String args[]){
                            HelloWindow frame=new HelloWindow
                               (“Hello_,_Window”);
                            frame.setSize(300,300);
                            frame.setVisible(true);
                } 

                public void paint(Graphics g) {
                            g.drawString(“Hello_,_java_Graphic_Interfaces?”                            ,50,100);
                }
    }

 

    vi 에디터 등을 이용하여 ‘HelloWorld.java’라는 이름으로 저장하도록 하자. 우선 우리는 이 소스 파일을 자바 가상머신에서 동작할 수 있는 바이너리로 코드로 만들어 주어야 한다.
    바이너리 코드를 만들기 위해 자바 컴파일러 ‘javac’을 사용한다.

    ‘% javac HelloWorld.java’

    아무이상 없이 프롬프트가 떨어 졌다면 컴파일이 성공적으로 끝난 것이다. ‘ls -l’ 명령어를 사용하여 확인하여 보면 ‘HelloWorld.class’파일이 생성되었음을 알 수 있다. 프로그램의 실행 결과를 보기 위해 자바 인터프리터를 이용하여 다음과 같이 확인할 수 있다.

    ‘% java HelloWorld’

    JDK1.2.2가 성공적으로 설치하고 프로그래밍할 수 있는 환경을 만들어 보았다.

 

Jbuilder 설치하여 사용해 보기

    볼랜드(Borland)의 ‘Jbuilder’는 자바를 위한 최고의 툴이라고 불리워지는 개발 툴이다.
    ‘Jbuilder’의 특징을 살펴보면 다음과 같다.

    컴포넌트 기반의 프로그래밍
    ‘Jbuilder’는 컴포넌트 기반의 프로그래밍을 도와 주는데 , GUI 컴포넌트를 이용할 때에는 마우스로 드래그앤드롭하여 프로그램에 컴포넌트를 삽입하기만 하면 된다. 물론 사용자가 컴포넌트를 만들어 등록할 수도 있다. 자바빈즈(JavaBeans) 역시 쉽게 만들 수 있고 자바빈즈 마법사를 이용하여 등록 후 쉽게 프로그램에 삽입할 수 있다.

    강력한 디버깅 기능
    ‘Jbuilder’는 프로그램상의 오류를 잡기 위한 많은 디버깅 옵션을 가지고 있다.

    코드 브라우징 기능
    ‘Jbuilder’는 코드에서 사용되어진 라이브러리 및 사용자가 작성한 함수들을 쉽게 참조할 수 있도록 해준다. 클래스명 또는 변수명들을 통해 사위 클래스의 타입 및 정의를 모두 화면에 볼 수 있다.

    멀티 컴포넌트 라이브러리
    ‘Jbuilder’는 AWT , Swing , JBCL 등의 다양한 컴포넌트들을 제공한다. ‘AWT’,’Swing’은 순수한 자바 라이브러리로써 썬에서 제공하는 기본적인 것들이다.

    ‘Jbuilder’에 대한 언급은 이 정도에서 끝내기로 하고 리눅스용 ‘Jbuilder’의 라이센스를 등록하고 설치하여 사용하는 방법을 알아 보도록 하자. 리눅스에서는 사용자 등록만 하면 무료로 다운로드하여 사용할 수 있도록 배포되고 있다.

 

‘Jbuilder’를 구할 수 있는 곳은?

    ‘http://www.borland.com/jbuilder/linux/’에서 리눅스용 ‘Jbuilder’에 대한 정보를 얻을 수 있다. 리눅스용 ‘Jbuilder’의 권장 사항은 다음과 같다.

    리눅스용 ‘Jbuilder’를 다운로드 받기 위한 URL은 다음과 같다.
    http://www.borland.com/jbuilder/foundation/download/linux.html#download
    ‘unix_jb30foundation_novm.tar.gz’ 파일을 다운로드 받도록 하자.
     

    배포본

    RedHat Linux 6.x

    메인 메모리

    128 MB

    하드 디스크 공간

    150 MB hard disk space

    x86 CPU

    Pentim Ⅱ 200㎒


    <Jbuilder의 시스템 사양>

 

‘Jbuilder’를 설치하기

    ’JBuilder’를 설치하기 전에 우선 볼랜드 홈페이지에서 ‘Activation Key’를 얻어야 한다.
    ‘Activation Key’부분을 클릭하여 링크되어진 페이지로 이동되는데 그곳에서 ‘New user’를 선택하여 사용자 등록을 마치면 다음과 같은 ‘Activation Key’를 얻을 수 있다.

    ‘Jbuilder’를 설치할 때 필요하니 메모를 해두거나 파일로 저장해 두기 바란다.

    (인스톨레이션 키와 시리얼 키를 얻은 화면)

    Activation 키를 얻었다면 다음과 같이 실행한다.
    ‘% tar xvzf unix_jb30foundation_novm.tar.gz’ 압축이  다 풀리면 새로 생성된 Jbuilder 디렉토리로 이동하여 인스톨 스크립트를 실행 시킨다.
     

    인스톨 스크립트를 실행할 때에는 처음부터 ‘root’로 엑스 윈도우에 로그인 하지 않았다면 로그 아웃을 한 후에 엑스윈도우 로그인을 ‘root’로 하기 바란다. 이것은 엑스 윈도우 자체의 Security 기능이 있기 때문에 다른 유저로 ‘Xsession’을 연 상태에서 ‘su’등으로 권한이 바뀌게 되면 엑스윈도우 화면에 디스플레이할 권한이 없기 때문이다.

     

    ’JDK’가 설치된 디렉토리를 물어 보는데 자신의 시스템에 맞게 선택하여 주면 라이센스 키를 묻는 화면이 나온다. 사용자 이름과 라이센스 키를 등록 시키면 Jbuilder와의 첫 대면을 할 수 있을 것이다.

 

    <Jbuilder의 작업화면>

    볼랜드는 MS의 비주얼 베이직과 컴포넌트 프로그래밍 툴의 양대 산맥인 델파이(Delphi)도 곧 리눅스로 포팅하여 발표할 예정이라고 한다. 이제 리눅스에는 전통적인 유닉스 개발 환경과 비주얼한 컴포넌트툴 들을 동시에 갖출 수 있게 되었다. ‘Jbuilder’의 구체적인 사용법에 대해서는 시중에 나와 있는 좋은 입문서들을 참고 하시길..

 

리눅스에서의 ‘perl’

    ‘perl’의 소개
    PERL(Practical Extraction and Report Language)은 주로 CGI 프로그래밍에 사용되어 지는데 원래 처음부터 CGI를 목적으로 태어난 언어는 아니다. 그러나, PERL을 이용하여 CGI프로그래밍을 해보면, 왜 PERL이 요즈음의 CGI 프로그래밍 언어의 주류가 되었는가를 알 수 있게 될 것이다. (요즘엔 perl 보다 PHP가 압도적으로 많이 쓰인다.)

    PERL의 장점을 살펴 보면 다음과 같다.
    ● 컴파일이 필요없는 스크립트 언어다.
    ● 프로그램의 크기가 특별히 크지 않는 한 컴파일된 실행 파일만큼 빠른 실행 속도를
        제공한다.
    ● 배우기 쉽다.
    ● 문자열 및 배열 처리 기능이 뛰어나다.

    리눅스에서 ‘perl’을 사용하여 간단한 예제를 실행 시켜 보도록 하자.
    리눅스에서 ‘perl’ 인터프리터의 위치는 ‘/usr/bin/’ ,’ /usr/local/bin/’ 이다. 다음과 같은 예제를 만들어 보자.
     

    #!/usr/bin/perl
    # hello.pl

    print “Hello World\n”;

     

    vi 에디터 등으로 파일을 만든 후 hello.pl 이라고 이름을 붙여 주자.

    위의 소스는 정말 간단하지만 완벽한 프로그램이다.
    print는 다음의 문자열, 숫자, 변수 등을 표준 출력기인 STDOUT에 출력한다. (챕터 3의 리다이렉션 부분 참조.)
    참 쉽군요. 첫줄의 #!/usr/bin/perl은 UNIX, Linux등의 운영체제에서 ‘/usr/bin/’에 ‘perl’인터 프리터가 있다는 것을 알려 주는 것이다. \n : C++의 \n과 같은 역할로써 커서를 다음줄 앞으로 보내는 일을 한다. (new line) # : 이 문자 이후부터 끝까지는 주석문으로써 perl로부터 무시되는 곳이다.
    ‘;’ 한 명령문은 언제나 ;(colon)으로 끝난다. 이것이 빠지면 ‘perl’ 인터프리터가 다음 라인과 현재 라인을 구분할 수 없게 되어 error가 발생한다. ‘perl’로 프로그래밍 되어진 파일들을 터미널 상에서 실행 시켜 보려면 다음과 같이 할 수 있다.
     

    2% liks@Hero:~> perl hello.pl
    Hello World
    3% liks@Hero:~>

     

    ‘hello.pl’을 ‘perl’이라는 인터프리터로 해석하여 실행하라는 의미이다.
    혹은 다음과 같이 실행 권한을 주어서 곧바로 실행할 수도 있다.
     

    3% liks@Hero:~> chmod 755 hello.pl
    4% liks@Hero:~> ./hello.pl
    Hello World
    5% liks@Hero:~>

     

 

‘perl’ 문법의 간단한 소개

    변수(VARIABLE)
    PERL의 변수는 크게 3 가지로 나누어진다..

    scalar variable.
    array.
    associative array.

    Perl 언어는 변수이름의 앞에 특별한 기호를 붙여 줌으로써 변수의 형태를 구분한다. scalar 변수는 변수명 앞에 $를 붙여서 구분하는데 일반적인 변수라고 볼 수 있다. ‘scalar’라는 말은 대개 ‘실수(實數)로 표시할 수 있는 수량’이란 뜻이다. PERL 에서는 문자열도 스칼라 데이터 타입으로 저장된다. ‘C’언어를 공부하신 분은 당황스러울지도 모르겠지만, 상당히 편리하게 사용할 수 있는 변수형태이다.

    $num = 1000;
    print “$num\n”; # <- ‘\n’은 새로운 라인을 나타낸다.
    $num = “One Thousand.”;
    print “$num\n”;

    위의 예에서와 같이 숫자를 할당했던 변수에 문자열을 재 할당하여 사용할 수 있다. ‘C’언어를 공부하신 분들은 ‘와~!!’ 라는 소리를 지르실지도 모르겠네요.
    array는 ‘C’언어에서와 마찬가지로 배열을 뜻한다. 배열이란 복수의 일반변수들을 변수 각각의 이름이 아닌 특정변수 참조하여 하나 하나의 세부 항목에 접근할 수 있도록 해주는 데이터 타입입니다. 변수가 배열임을 가르쳐 줄 때에는 변수 앞에 $가 아닌 ‘@’ 기호를 사용한다. 배열의 예를 살펴 보도록 하자.
     

    @testarray; --> ‘testarray’가 배열임을 선언한다.
    $testarray[0] = “홍길동”; --> 배열 각각의 구성요소들을 나타낼 때는 ‘$’를
                                               사용한다.
    $testarray[1] = “임꺽정”;
    $testarray[2] = “똘이장군”;
    $testarray[3] = “태권브이”;
    print $testarray[2], “\n”;
    print “$testarray[2]\n”;

     

    ‘[ ]’ 안에 들어있는 숫자는 배열 안에서의 위치를 나타내는 것으로써 ‘참조번호’라고 부른다.
    때때로 프로그램을 짜다 보면 마지막 참조 번호, 즉 배열의 크기를 알아야 할 때가 있는데 그럴 경우에는 다음과 같은 방법으로 알아 볼 수 있다 .

    $lastIndex = $#testarray;

    위에서처럼 배열의 이름 앞에 $#를 붙이면 배열 @testarray의 맨 마지막 요소의 참조번호(index number)를 알 수 있다. 즉 $lastIndex 또는 $#testarray의 값이 2 라면 배열의 첫 참조번호는 0 이므로 요소의 갯수는 모두 3개인 셈이다. 배열의 크기를 조절할 때에도 다음과 같이 마지막 참조번호를 이용할 수 있다.

    $#testarray = 2; # 마지막 참조번호를 2로 제한...

    $testarray[2]는 사라지게 되고 3개의 요소($testarray[0], $testarray[1], $testarray[2])만 남겨지게 된다. 배열의 크기를 알아내는 방법에는 마지막 참조번호($#testarray)를 보는 것 외에도 배열 이름을 그대로 사용하는 방법이 있다.
     

    @testarray = ( a, b, c, d );
    $last = @testarray;
    print “$last\n”;

     

    위의 예에서는 변수 ‘$last’에 배열 안의 원소의 개수인 ‘4’라는 숫자가 화면에 출력된다.

    ‘print’함수는 ‘hello.pl’에서도 간단하게 사용해 보았는데 , 좀더 자세히 알아 보도록 합시다.
     

    # hellohello.pl 

    print <<end_greeting;
    안녕 하세요~!
    펄이 재미있다고요?!
    좋은 하루되시기를~..
    end_greeting
    print “Hello , Hello ~!! \n”;

     

    print 다음에 나오는 <<end_greeting 이라는 것의 의미는 문장을 print하는데 있어서 첫 end_greeting (혹은 또는 사용자가 임의로 정하는 그 무엇, end_hello 이나 asdf_end등) 가 나올 때까지 진행하라는 의미이다.

    펄은 사용방법이 쉽고 간단하기 때문에 많이 사용되어 진다. 인터넷이나 각 통신망등에 펄에 대한 강좌가 널리 보급되어 있으므로 여러분들은 쉽게 공부할 수 있을 것이다.

 

엑스 윈도우에서의 프로그래밍

    엑스 윈도우 상에서 프로그래밍을 하기 위해서는 ‘X server’ , ‘X client’ , ‘X protocol’ , ‘X library’ 이들의 관계를 간단하게 표현 하자면 ‘사용자와 상호 대화’,’애플리케이션’,’클라이언트 서버 의 통신’,’프로그래밍 인터페이스’ 로 바꾸어 생각할 있다. 엑스 윈도우는 설계 당시부터 ‘클라이언트 /서버’ 모델로 설계되었다. 과거에는 엑스 윈도우에서의 프로그래밍은 ‘X library’를 통해서 하는 것이 일반적 이었으나 요즘에는 쉽고 간단하게 ‘위젯(widget)’을 만들어주는 라이브러리들이 많이 개발되어져 있다.

    ‘위젯’이란 GUI 환경에서 사용되어지는 여러 가지 인터페이스 형식들을 말한다. 대화창이라던가 파일을 열고 닫는 메뉴라던가.. 우리는 ‘Tcl/TK’와 ‘GTK+’라이브러리에 대해서 알아 보도록 하겠다.

 

Tcl/TK

    ‘Tcl’은 John Ousterhout씨가 개발한 인터프리터 방식의 언어이다.
    Tcl(Tool Command Lanuage : ‘티클’)은 다른 응용프로그램에 쉽게 포함될 수 있도록 설계된 스크립트 언어로 Jone K. Ousterhout에 의해 만들어졌다. (‘Tcl’은 현재 ‘perl’,’Pytho’등과 바인딩이 가능하다.) Tcl의 기본골격 자체는 심플한 것으로 언어 그 자체에 대한 이해는 쉽게 할 수 있다. C로 작성된 그 핵심 부분은 소스까지 완전히 공개되어 있으며, 또한 이미 다양한 플랫폼에 대한 포팅이 이루어져 있다. Tclsh(wish)로 알려진 인터프리터는 Tcl의 하나의 응용인 동시에 Tcl 자체를 구동하는 기본 프로그램이다. Tk(Toolkit : ‘티케이’)는 Tcl에 기반하는 윈도우 시스템의 GUI를 위한 확장이다. wish로 알려진 인터프리터에 의해 구동된다. 현재 Tcl/Tk는 Sun Microsystems가 Jone K. Ousterhout를 영입하여 적극 지원함으로써 사실상 Sun에 의해 개발되고 있다고 볼 수 있다. 그런 까닭에 최신의 정보는 Sun의 http://sunscript.sun.com에서 얻을 수 있다.

    예제를 통하여 살펴 보도록 하자.
     

    #!/usr/bin/wish -f

    pack [button .b -text “Hello\n Debian/GNU Linux\n “ \
    -justify center \
    -width 20 \
    -command { puts “^^;?}]

     

    ‘perl’에서와 마찬가지로 인터프리터의 경로를 ‘#!’와 함께 표시해 준다. ‘-f’옵션은 스크립트를 실행 시킬 때에 상호 대화적 ‘wish’창이 뜨지 않도록 하는 것이다.’button’ 부분을 보면 쉽고 간단하게 위젯을 확장시킬 수 있다는 것을 알 수 있다.
    -text 부분에는 말 그대로 글씨가 들어가고 , -justify 부분에는 텍스트의 위치 속성이 들어 갔다. -width 부분에는 넓이의 속성 값이 들어 가있고 -command 부분에는 tcl에서 사용할 수 있는 명령어 부분이 포함되어 있다.

     

    (예제의 실행 화면)

    ‘Tcl/TK’에 대한 부분은 Sun의 홈페이지에서 많은 정보를 구할 수 있고 ‘Tcl/TK’를 이용하여 ‘X 윈도우’ 프로그래밍에 대한 부분을 다룬 책들도 여러 권 나와 있다.(한글 판은 본적이 없네요.) ‘Tcl/TK’를 익힌다면 엑스 윈도우상에서 쉽게 멋진 프로그램들을 구현할 수 있을 것이다.

 

GTK/Library를 이용한 엑스 윈도우 프로그래밍.

    엑스 윈도우 프로그래밍에서는 여러 가지 라이브러리들을 사용할 수 있다. 대표적인 것으로 예전에 많이 사용되었던 ‘motiff’ 가 있고 최근에 많이 사용 되어지고 있는 GTK+ , qt 라이브러리 등이 있다. GTK+ 같은 경우는 리눅스 용 ‘포토샵’이라고 불리워지는 GIMP라는 프로그래밍을 개발하던 도중에 여러 가지 위젯들이 모여 지면서 개발되어진 라이브러리이다.
    GTK는 ‘Gimp ToolKit’의 약자이다. GTK+을 이용하여 프로그래밍을 하려면 gtk+ 패키지와 gtk+-devel 패키지가 필요한데 최근의 배포본들에는 기본적으로 설치되어 있다. 혹시라도 설치되어 있지 않다면 http://www.gtk.org에서 RPM형태의 패키지를 다운로드 받아 쉽게 설치할 수 있다.

 

GTK+ 라이브러리를 이용해 ‘Hello World’를 출력해 보도록 하자.

    ‘Hello GTK+’이라는 버튼을 출력하는 프로그램을 만들어 보자.
     

    #include <gtk/gtk.h>

    void hello (GtkWidget *widget, gpointer data)
    {
                  g_print (“Hello world\n”);
    }
    gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
    {
                  g_print (“delete event occured\n”);
                  return (FALSE);
    }
    void destroy (GtkWidget *widget,gpointer data)
    {
                  gtk_main_quit();
    }
    int main (int argc,char *argv[])
    {
                  GtkWidget *window;
                  GtkWidget *button;
                  gtk_init (&argc,&argv);
                  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

                  gtk_signal_connect (GTK_OBJECT (window), 
                               ”delete_event”, GTK_SIGNAL_FUNC                            (delete_event),NULL);

                  gtk_signal_connect (GTK_OBJECT (window),”destroy”,                            GTK_SIGNAL_FUNC (destroy),NULL);

                  gtk_container_border_width (GTK_CONTAINER (window),                            20);
                  button = gtk_button_new_with_label (“Hello GTK+”);
                  gtk_signal_connect (GTK_OBJECT (button),”clicked”,                            GTK_SIGNAL_FUNC (hello),NULL);

        gtk_signal_connect_object (GTK_OBJECT (button),”clicked”, GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (window));

                  gtk_container_add (GTK_CONTAINER (window),button);
                  gtk_widget_show (button);
                  gtk_widget_show (window);
                  gtk_main ();
                  return 0;
    }

     

    위 프로그램을 컴파일하는 방법은 다른 프로그램을 컴파일할 때와는 사뭇 다르다.
     

    % gcc -Wall -g -o hello hello-gtk .c \gtk-config --cflags gtk-config --libs
    % ./hello

     

    ‘gtk-config’명령어는 gtk 라이브러리를 사용할 때에 필요한 헤더 파일과 라이브러리의 링크 옵션을 대신 처리해 명령어로써 다음과 같이 실행해 보면 알 수 있다.
     

    5% liks@TioD:~> gtk-config
    Usage: gtk-config [OPTIONS] [LIBRARIES]
    Options:
               [--prefix[=DIR]]
               [--exec-prefix[=DIR]]
               [--version]
               [--libs]
               [--cflags]
    Libraries:
               gtk
               gthread
    6% liks@TioD:~>

     

    컴파일할 때에 사용한 ‘gtk-config --libs’,’gtk-config --cflags’를 실행해 보자.
     

    6% liks@TioD:~> gtk-config --libs
    -L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lX
    ext -lX11 -lm
    7% liks@TioD:~> gtk-config --cflags
    -I/usr/lib/glib/include -I/usr/X11R6/include
    8% liks@TioD:~>

     

    GTK는 엑스 윈도우 기반의 프로그램을 만들기 위한 라이브러리이기 때문에 컴파일할 때는 엑스 윈도우상태가 아니어도 상관이 없지만 실행시킬 때에는 반드시 엑스 윈도우 상태이어야 한다.

    <’hello GTK+’ 실행 화면>

 

쉘 스크립트에 대해서..

    쉘에 대해서(쉘이 어떤 역할을 하는지)는 앞의 챕터들에서 알아보았다. 운영체제의 핵심 부분인 커널. 그 기반 위에서 사용자와 운영체제를 연결 시켜주는 부분을 우리는 일반적으로 쉘(shell) 이라고 부른다. 쉘은 사용자가 요구하는 응용프로그램을 운영체제에 전달해 사용자가 원하는 결과를 얻도록 해주는 역할을 담당하는 인터페이스라고 할 수 있다..

    쉘프롬프트 상에서는 사용자가 입력한 명령어를 해석하고 뜻을 확정 짓기 전에 먼저 확인하는 전이문자(meta character)들이 존재한다. 이들에 대해서 간단히 보도록 하자.
     

    > --> 표준 출력을 ‘>’ 뒤에 지정하는 이름의 파일로 기록하는 리다이렉션.
    < --> 표준 입력을 파일로부터 입력받는 리다이렉션.
    >> --> 표준 출력을 파일의 뒤에 추가하는 출력 리다이렉션.
    <<asdf --> ‘asdf’까지 표준 입력을 읽는 입력 리다이렉션.
    * --> 0 개 이상의 문자를 대표하는 치환문자입니다.흔히 와일드 카드라고 한다.
    ? --> 하나의 문자를 대표하는 치환 대표 문자이다.
    ‘ ‘ --> 작은 따옴표 사이의 명령의 수행 결과로 대치되는 명령 치환
    | --> 한 프로세스의 출력을 다른 프로세스의 입력으로 연결하는 파이프
    || --> 앞의 명령이 실패하면 뒤의 것을 실해하는 or 조건 판단문
    && --> 앞의 명령이 성공해야 뒤의 것을 실행하는 and 조건 판단문
    ( ) --> 명령들을 그룹으로 묶는 전이 문자.
    & --> 명령을 백그라운드(background)에서 실행하는 전이 문자.
    $ --> 변수 접근을 의미하는 전이문자

     

    위와 같은 전이 문자 중에서 사용에 주의해야 할 부분이 있는데 바로 모든 문자를 대체 하는 ‘*’ 와일드 카드이다. 와일드 카드는 특히 rm 명령어와 같이 사용될 때 매우 위험한데 다음과 같은 경우를 생각해 보자. 만약에 실수로 ‘*.txt’ 라는 파일을 만들었다고 하자.
    이 파일을 어떻게 지워야 할까? ^^; ‘*’ 라는 전이문자를 일반 문자로 대체 시켜주는 특수문자(‘\’)가 존재한다.

    rm \*.txt 이렇게 지우면 위와 같은 상황을 해결할 수 있을 것이다.(여담이었습니다.^^;)

    리다이렉션과 파이프에 대해서는 챕터 3을 참조 하시면 됩니다.

    쉘 스크립트는 실행될 때에 여러 가지 환경 변수의 값에 영향을 받는다. 이 변수들은 보통 대문자로 표시되는데, 사용자 정의 변수들과 구별하기 위해서 입니다.(사용자 정의 변수들은 편의상 대부분 소문자를 즐겨 쓰죠..) 핵심적인 환경 변수들은 다음과 같다.
    ( 자세한 내용은 ‘man’ 페이지를 이용하시면 보다 많이 알 수 있습니다.)

    환경 변수 - 변수 설명..
     

    $PATH - 실행 명령어를 찾기 위해 사용되는 디렉토리 목록 ‘;’로 구분
    $HOME - 사용자의 홈디렉토리 정보
    $PS1 - 명령행 프롬프트 , 보통은 $입니다.
    $PS2 - 두 번째 프롬프트 , 추가적인 입력을 위한 프로프트를 나타내기 위해 사용되며,
                보통은 > 입니다.
    $IFS - 입력필드 구분자.쉘상에서 입력을 읽어들일 때 낱말을 구분하기한 목적으로
              사용되는 문자 목록, 보통은 스페이스,탭,..
    $0 - 쉘스크립트 이름
    $# - 전달된 인자의 개수

     

    $$ - 쉘 스크립트의 프로세스 ID,쉘 스크립트 내부에서 중복되지 않는 임시 파일의
            이름을 만들 때 자주 사용됨.
           ex) /tmp/trash_$%.등..
    $MAIL - 전자 우편 파일의 경로와 이름을 가지고 있다.
    $LOGNAME - 사용자 이름 변수
    $HOSTNAME - 현재 컴퓨터의 이름을 가지고 있다.
    $HOSTTYPE - 컴퓨터의 종류를 나타냅니다.i486 같이..
    $OSTYPE - 무엇일까요?~ ^^; Linux 로 정의되어 있습니다.
    $LS_COLORS - ls 명령을 사용할 때 파일의 종류에 따라 지정된 색상

 

    인자 변수 - 변수 설명
     

    $1,..$2.. - 스크립트로 전달된 argument 입니다.
    $* - 스크립트로 전달된 인자 전체로 하나의 변수에 기억 저장되며
    $IFS - 환경 변수의 첫번째 문자로 구분된다.
    $@ - $*와는 미묘한 차이가 있다. 이 변수는 IFS 환경 변수를 사용하지 않는다.
            각 변수가 따옴표로 구분된 모든 인수 값을 갖는다.
    $! - 마지막 실행된 명령의 프로세스 ID 값을 갖는다.
    $? - 마지막 실행된 명령의 리턴 값을 갖는다.

     

    중요한 환경변수와 인자 변수들을 살펴 봤습니다. 간단히 환경변수들의 내용을 살펴 봅시다.

    39% liks@doit:~> echo $HOSTNAME
    doit
    40% liks@doit:~> echo $OSTYPE
    linux-gnu
    41% liks@doit:~>

    우리는 ‘echo’ 명령어를 이용해 각 변수의 설정 값을 알아 볼 수 있다. 각 변수들이 값을 어떤 식으로 가지고 있는지 알아 보는 것이 나중에 많은 도움이 될 것이다.
    그럼 간단한 사용자 변수를 만들어 보고 화면에 출력해 확인해 보도록 합시다.

    86% liks@doit:~> linux=”It is a nice Operation System”
    87% liks@doit:~> echo -e ‘How about linux?\n’$aicc
    How about linux?
    It is a nice Operation System
    88% liks@doit:~>

 

    #### ^^; ‘echo’ 명령어에 대해서 간단히 알아 봅시다. ^^; ####
    ‘echo’ 는 인수로 지정된 문자열을 그대로 화면에 출력합니다.이것은 인수로 주어진 문자열이 오퍼레이팅 시스템으로 읽혀진 후에 다시 그대로 화면에 디스플레이 해주는 역할을 합니다.

    echo [ -ne ] 스트링
    OPTIONS;
    -n : 새로 개행하지 않고 출력하게 한다.
    -e : 문자열 중에서 백슬래쉬와 조합되는 특수 문자를 인식하게 한다.

    이러한 특수 문자들은 다음과 같은 것들이 있다.
    \a 삑소리.(별로 듣기에 안좋군요 ^^;) \b 백스페이스
    \f 용지 바꿈 (form feed) \n 행바꿈
    \v 수직탭 \\백슬래쉬 문자.
    \nnn 8진법으로 표기되는 ASCII 문자 \c 출력 후 행바꿈 금지

 

    이번에는 셋팅된 사용자 변수를 클리어 시켜 봅시다.

    91% liks@doit:~> unset linux
    92% liks@doit:~> echo -e ‘How abour linux? \n’$linux
    How about linux

    93% liks@doit:~>

    환경변수 ‘$linux’ 에 저장된 값이 클리어된 것을 확인하실 수 있습니다. 위에서 설명한 ‘echo’ 명령은 실제로 프롬프트 상에서는 거의 쓰이지 않지만 쉘스크립트 상에서는 아주 빈번히 사용되는 명령어입니다.

    이제 간단한 쉘 스크립트를 짜 보도록 합시다.

    108% liks@doit:/tmp> cat > test.sh
    #!/bin/sh
    clear
    cal
    echo
    echo $1
    echo GREAT!!

    109% liks@doit:/tmp>chmod +x test.sh
    110% liks@doit:/tmp>./test.sh niceGuy

    September 1999
    S M Tu W Th F S
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30

    niceGuy
    GREAT!!

    111% liks@doit:/tmp>

    눈여겨 보실 것은 쉘스크립트의 시작은 ‘#!’와 쉘의 절대 경로명을 함께 적어 준다는 것이지요. ‘sh’ 는 ‘bash’와 심볼릭 링크되어 있습니다. ‘/tmp’ 가 실행 PATH 가 아니기 때문에 test.sh 를 ‘/tmp’ 에서 찾도록’./’뒤에 ‘test.sh’ 를 써주셔야 합니다. ‘.’은 현재 디렉토리를 의미합니다. chmod +x 는 쉘 스크립트를 실행 가능한 명령어로 바꾸기 위해서 사용되었습니다. 위의 스크립트는 화면을 클리어하고 달력을 출력하고 echo 명령으로 두 줄의 공백을 만들고 인자로 받은 niceGuy를 출력하고 다시 GREAT!!를 출력하는 간단한 스크립트였습니다.

    좀더 진보한 쉘 스크립트를 만들어 보기 위해 자주 사용되어지는 조건 판단 ,반복 문법등에 대해서 알아 봅시다.

     

    ### 조건문 ###
    조건문은 모든 프로그래밍 언어의 기본이라고 할 수 있다. 어떤 조건을 판단하고 그에 따른 여러 다른 행동들을 취할 수 있는.. 쉘 스크립트에서는 ‘test’ 와 [ ] 명령을 이용하여 참, 거짓을 판단해 냅니다.

    ‘test’ 명령어는 쉘에 포함되어 있는 내부 명령어가 아니라 외부 명령어입니다.
    한번 확인해 보시죠. ‘which test’ 혹은 ‘whereis test’ 혹은 ‘find / -name test’ ‘/bin/test’ 나 ‘/usr/bin/test’ 를 찾으실 수 있을 겁니다.

    ‘test’ 명령어에서는 세가지 형태의 명령어 타입을 사용할 수 있습니다. 그것은 문자열 비교, 산술 비교, 파일 조건입니다. 명령어 타입은 다음과 같습니다.

    == 문자열 비교 ==
     

    string : 스트링이 빈 문자열이 아니라면 참.
    string1 = string2 : 두 문자열이 같다면 참.
    string1 != string2 : 두 문자열이 같지 않다면 참.
    - n string : 문자열이 널이 아니라면 참
    - z string : 문자열이 널이라면 참.

     

    == 산술 비교 ==
     

    exp1 -eq exp2 : 두 표현식 값이 같다면 참.
    exp1 -ne exp2 : 두 표현식 값이 같지 않다면 참.
    exp1 -gt exp2 : exp.1 이 exp.2 보다 크다면 참.
    exp1 -ge exp2 : exp.1 이 exp.2 보다 크거나 같다면 참.
    exp1 -lt exp2 : exp.1 이 exp.2 보다 작다면 참.
    exp1 -le exp2 : exp.1 이 exp.2 작거나 같다면 참.
    !exp : expression 이 거짓 이라면 참. 참 이라면 거짓.

     

    == 파일 조건 ==
     

    -d file : file이 디렉토리라면 참.
    -e file : file이 존재한다면 참.
    -f file : file이 정규 파일이라면 참.
    -g file : file 상에 set-group-id가 설정되어 있다면 참.
    -r file : file 이 읽기가 가능하다면 참.
    -s file : file 의 크기가 0이 아니라면 참.
    -u file : file상에 set-user-id 가 설정되어 있다면 참.
    -w file : file 이 쓰기 가능하다면 참.
    -x file : file 이 실행 가능하다면 참.

     

    ‘test’ = ‘[]’ 를 알아 봤으니 이제 if 문과의 활용 법을 알아 봅시다.

    --------------------------------------------------------
    if 조건
        then
        문장
             else
             문장
    fi
    --------------------------------------------------------

    간단한 스크립트를 만들어서 테스트 해봅시다.
     

    #!/bin/sh
    echo “공 CD 한장에 얼마 입니까?”
    read price
     

    if [ $price = “100원” ] ; then
    echo “아주 싸군여..^_^”
    elif [ $price = “10000원” ] ;then
    echo “으헉... 너무 비싸넹.. 안사 -_-;”
    else

    echo “멍멍멍 바보.. 8-P”
    fi
    exit 0

     

    위 스크립트를 살펴 봅시다. ‘read’ 는 변수를 읽을 수 있도록 하는 구문입니다.
    형식은 위와 같이 ‘read 변수’ 형태로 사용하시면 됩니다.
    if 문과 then 을 같은 라인에 사용할 때에는 ‘;’ 세미콜론으로 구분하게 됩니다.
    그리고 우리가 위에서 알아본 ‘test’ 명령어가 ‘[]’ 형태로 사용되었습니다.

    한가지 재미있는 부분은 ‘if’ 문이 끝날 때는 ‘fi’ 알려 준다는 것이지요. 뒷 부분에 나오겠지만 ‘case’ 문이 끝날 때에는 ‘esac’ 입니다. ^^;

    다음은 ‘for’ 구문에 대해서 알아 보겠습니다.

    --------------------------------------------------------
    for 변수 in 밸류..
    do
    문장
    done
    --------------------------------------------------------

    밸류 값들은 대개 문자열입니다. 변수들을 반복해서 출력해 주는 간단한 스크립트를 만들어 봅시다.

    #!/bin/sh
    for name in liks love forever
    do
    echo $name
    done
    exit 0

    결과는 liks,love,forever 를 순서대로 출력해 주겠지요. 앞에서 살펴본 echo 명령어 옵션에서 -n 을 주게 된다면 주욱 붙어서 나오겠지요. 변수의 개수만큼 echo 문이 실행되는 간단한 스크립트였습니다. 이 때에 변수의 밸류에 공백을 넣고 싶을 때에는 따옴표로 묶어 주시면 됩니다. “liks doit forever” 이런 식으로 되겠지요.
    for 구문을 사용한 간단한 예를 하나 더 살펴 봅시다.

    #!/bin/sh
    for print in $(ls asdf[123].txt)
    do
    cat $print | lpr
    done
     

    이 스크립트는 asdf1.txt , asdf2.txt , asdf3.txt 파일을 print 의 각각의 변수로 읽어 와서 for 명령의 인자 목록으로 들어 갑니다. 일종의 와일드 카드로 사용되어진 것입니다. 

    $(명령어) 는 이 부분은 () 안의 명령어의 스탠다드 아웃 출력을 변수로 취할 수 있도록 해줍니다. 각각의 파일을 cat 으로 읽어서 lpr 에게 파이프로 출력을 넘겨주어 프린팅을 할 수 있게 되겠지요. cat $print | lpr 대신에 lpr $print 해도 상관 없습니다. 

    “while 구문”
    쉘에서의 변수는 모두 기본적으로 문자열로 취급되기 때문에 , for 루프는 일련의 문자열을 사용하기에는 좋을지 모르나 어떤 명령을 지정된 횟수만큼 실행 시키기에는 실제로 불편합니다. 어떤 특정 명령을 100번 실행 시키게 된다면 변수의 밸류가 100개가 필요하게 되겠지요. 바로 이럴 때 ‘while’ 루프를 사용하게 됩니다.
     

    ‘while’ 구문의 용법은 다음과 같습니다.

    --------------------------------------------------------
    while 조건문
    do
    문장
    done
    --------------------------------------------------------

    재미있는 것을 하나 만들어 볼까요~.. 

    #!/bin/sh
    echo “암호를 입력하세요:”
    read passwd
     

    while [ “$passwd” !=”천재강백호” ]
    do
    echo “당신은 인증된 사용자가 아닙니다.암호를 입력해 주세요”
    read passwd
    done
    echo “오호~ 어떻게 알았지? --;”
    exit 0
     

    물론 이 프로그램은 보안에 전혀 도움이 되지 않습니다. -_-; ctrl+c 를 눌러 버리면 스크립트가 그냥 종료 되버릴 테니까.... 예전에 터미널환경에서 돌아가던 BBS 들 중에 쉘 스크립트로 작성된 BBS 들도 있었다고 합니다. 그 당시 로긴을 할 때에 ctrl+c를 사용해 루트 쉘로 빠져 나갈 수 있었다는 말들도 있군요. ^^; 

    아무튼 위 프로그램은 암호 “천재강백호” 가 입력될 때까지 올바른 암호 입력을 계속 요구하게 되지요. 이번에는 특정 명령을 일정한 횟수만큼 반복하는 스크립트를 만들어 봅시다. 

    #!/bin/sh
    raw=1
    while [ “$raw” -le 1000 ]
    do
    echo “천개의 촛불이 켜지면 특별한 사랑이 이루어 집니다.”
    raw=$(($raw+1))
    done
    exit
     

    ‘[]’ 부분은 ‘test’ 명령어를 참고 하세요. 위에서 눈여겨 볼 부분은 $(()) 구문입니다. $(()) 는 ‘()’안의 변수에 산술 연산을 할 수 있도록 해주는 구문입니다. 알아 두시면 유용하게 써먹을 때가 있으실 겁니다. 직접 실행해 보시고 결과 값을 확인해 보시길.. 

    이번에는 ‘case’ 구문에 대해서 살펴보도록 합시다.

    --------------------------------------------------------
    case 변수 in
    패턴) 명령어 ;;
    패턴) 명령어 ;;
    esac
    --------------------------------------------------------

    곧 바로 예제를 살펴 보도록 하겠습니다. 

    #!/bin/sh
    echo “ 천재 강백호의 X-FILE “
    echo
    echo 1\) 나의 생일
    echo 2\) 백호는 어디에 살까요?
    echo 3\) 내가 좋아하는 것
    echo Q\) 끝!!
    echo 

    read choice
    case $choice in
    1) echo “1979 년 04/14”
        echo “주모군의 생일이랑 같군여”;;
    2) echo “아주대학교 팔달관 315호 상주”;;
    3) echo “농구~ 그리고 채소연..”;;
     

    Q|q) echo “이 천재를 이기려면 10년은 더 수련하고 와라~!!”;; 

    *) echo “멍멍멍.. 바보”;;
    esac
     

    위의 예에서 눈여겨 보실 부분은 echo 문에서 ‘)’ 를 나타내기 위해 전이문자인 ‘\’ 이 사용되어진 점입니다. 그리고 ‘case’ 문 안에서 ‘Q|q) 의 or 연산이 사용되었다는 점이죠. ‘*’는 와일드 카드로 쓰였는데 1,2,3,Q,q 이외의 모든 문자들이 입력으로 들어 왔을 때 처리하기 위한 루틴입니다. ‘if’문에서 구문의 끝을 알려주기 위해 ‘fi’ 가 쓰였듯이 ‘case’ 문에서는 ‘esac’가 사용됩니다. 

    이 번에는 AND 와 OR 에 대해서 간단히 알아 보도록 하겠습니다. 

    AND를 사용하면 여러 명령을 한꺼번에 실행 시킬 수 있는 장점이 있습니다. AND 연산에서는 바로 전 단계의 명령이 성공하였을 경우에만 다음 번 명령을 수행하게 됩니다. 구문의 문법은 다음과 같습니다.

    --------------------------------------------------------
    statement1 && statement2 && statement3 && .............
    --------------------------------------------------------

    AND 구문은 모든 명령어가 성공적으로 수행되었을 때에만 참이 되고 , 다른 경우에는 거짓이 됩니다.

    OR 구문은 어떤 하나의 명령의 수행이 성공할 때까지 일련의 명령을 계속 수행하게 됩니다. 구문의 문법은 다음과 같습니다.

    --------------------------------------------------------
    statement1 || statement2 || statement3 || .............
    --------------------------------------------------------

    왼쪽 구문부터 시작하여 그 결과 값이 거짓(false) 라면 오른편의 명령어가 실행된다. 하나의 구문이 참(true)이 될 때까지 수행의 계속 하게 됩니다. 만일 어떤 구문이 참을 반환한다면 더 이상의 구문은 수행되지 않습니다.

    동아리 회원 전화 번호 관리를 위한 간단한 쉘 스크립트를 짜 봅시다.
    (tel.sh)
     
     

    #!/bin/sh 

    select_Memb(){
    echo -n “ 다시 찾을까요?(yes/no 종료:엔터) : “
    read sel
    case “$sel” in
    “yes” | “YES” | “예” | “y” | “Y” )
    search_Memb
    select_Memb;;

    “n” | “N” | “no” | “NO” )
    echo “ 프로그램을 종료합니다.”
    echo
    ;;
    *) echo
    echo “ Good Bye~.. *^^* Always Happy to you.. - 홍길동 -”
    echo
    ;;
    esac
    }
    search_Memb(){
    echo
    echo -n “ 찾고 싶으신 이름 혹은 기수를 말씀하세요(ex:아무개 or 1기) : “
    read name
    echo
    if [ “$name” = “” ]; then
    echo
    elif [ “$name” = “1” ] ; then
    cat /usr/local/bin/tel.txt | grep 1기
    elif [ “$name” = “2” ] ; then
    cat /usr/local/bin/tel.txt | grep 2기
    elif [ “$name” = “3” ] ; then
    cat /usr/local/bin/tel.txt | grep 3기
    elif [ “$name” = “4” ] ; then
    cat /usr/local/bin/tel.txt | grep 4기
    elif [ “$name” = “5” ] ; then
    cat /usr/local/bin/tel.txt | grep 5기
    elif [ “$name” = “6” ] ; then
    echo “ 회비를 내 주시기 바랍니다.^^;;”
    else
    cat /usr/local/bin/tel.txt | grep $name
    fi
    echo }
    echo
    echo “ +------------------------------------------+”
    echo “ | 우리동아리 회원 전화 번호부 찾기 |”
    echo “ +------------------------------------------+”
    echo “ made by 홍길동. v0.1 “
    search_Memb
    select_Memb
    exit 0
     

     

    ‘tel.txt’는 이런 식으로 입력하면 된다. 

    1기 96.마리오 데이터 베이스 연구실 Tel 018-388-8888
    1기 96.팬더 Tel 02-718-5885 , 011-8883-8888
    2기 97.임꺽정 정보공학 연구실 Tel 011-9037-0372
    2기 97.날라리 시스템소프트웨어 연구실 Tel 011-2222-2222
    3기 98.강백호 Tel (군복무중)
    3기 98.채소연 Tel (군복무중?)
    4기 99.채치수 Tel 012-3132-7436
    4기 99.홍길동 Tel 016-366-6666
    5기 00.서태웅 Tel 016-3000-3000, 222-2222 (Lab)
     

    위의 프로그램은 수정의 여지가 많이 있다. 여러 가지 더 나은 방법들을 고안해 보는 것도 괜찮을 것이다. (tel.sh에 실행 권한을 준 후 실행 가능한 패스에 넣어주면 된다. 자신의 시스템의 다른 유저들에게도 실행 권한을 주도록 하자. ^^;) 

    <쉘스크립트로 만든 전화 번호부>




▲ top

home으로...