차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
tech:bash [2014/10/31 13:50] – 만듦 V_Ltech:bash [2016/07/12 09:26] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +{{tag>bash 우분투 유닉스 리눅스 쉘 명령}}
 ====== Bash ====== ====== Bash ======
  
줄 41: 줄 42:
  
 =====변수 ===== =====변수 =====
-변수는 컴퓨터의 기억 장소 안의 이름 붙여진 저장 위치이다. 여러분이 하나의 변수를 정의할 때, 이 위치에는 그 변수의 정의된 값이 있게 된다[역자 주: 변수를 상자 A라고 불리는 상자라고 생각하자. 예를 들어 여러분이 상자 A에 공을 넣었다 하자. 그러면 상자 A의 값은 공이다]. bash 에는 환경 변수와 지역 변수, 이렇게 두 가지 타입의 변수가 있다. 환경 변수는 시스템에 의해 생성된 것이고 일반적으로 /etc/profile에 정의되어 있다. 이들 변수에는 SHELL, PS1, PATH 등이 포함되는데,  나중에 설명되어질 것이다. 지역 변수는 사용자에 의해서 정의되는 것으로 대개 ~/.bashrc 같은 지역적인 설정 파일에 위치한다. 이들은 bash 가 수행될 때 오직 그 사용자에게만 한정되어진다[역자 주: 환경 변수는 bash를 실행하는 모든 사람에게 영향을 주는 반면, 지역 변수는 자신의 지역적인 설정 파일에 그것을 명시한 사용자들에게만 영향을 준다]. +변수는 컴퓨터의 기억 장소 안의 이름 붙여진 저장 위치이다. 여러분이 하나의 변수를 정의할 때, 이 위치에는 그 변수의 정의된 값이 있게 된다[역자 주: 변수를 상자 A라고 불리는 상자라고 생각하자. 예를 들어 여러분이 상자 A에 공을 넣었다 하자. 그러면 상자 A의 값은 공이다]. bash 에는 환경 변수와 지역 변수, 이렇게 두 가지 타입의 변수가 있다.  
 + 
 +환경 변수는 시스템에 의해 생성된 것이고 일반적으로 /etc/profile에 정의되어 있다. 이들 변수에는 SHELL, PS1, PATH 등이 포함되는데,  나중에 설명되어질 것이다.  
 + 
 +지역 변수는 사용자에 의해서 정의되는 것으로 대개 ~/.bashrc 같은 지역적인 설정 파일에 위치한다. 이들은 bash 가 수행될 때 오직 그 사용자에게만 한정되어진다[역자 주: 환경 변수는 bash를 실행하는 모든 사람에게 영향을 주는 반면, 지역 변수는 자신의 지역적인 설정 파일에 그것을 명시한 사용자들에게만 영향을 준다]. 
  
 ====변수 정의하기 ==== ====변수 정의하기 ====
줄 580: 줄 585:
 </file> </file>
    
 +=====파일 만들기=====
 +<file>
 +You might try echo
 +
 +#!/bin/sh
 +echo "Inputing data into /home/user/test.txt"
 +echo "Hello Bob" > /home/user/test.txt
 +</file>
 +
 +
 +
 +
 +=====강좌=====
 +
 + 
 +
 +==== 간단한 텍스트 출력하기 ====
 +
 +우선 bash에서 가장 간단하게 출력 가능한 echo를 이용하여 
 +
 +"bash script test"라는 문구를 출력해보자 
 +
 +    # vi test.sh
 +    -------------------------------------------
 +    #!/bin/bash
 +    echo "bash script  test"
 +    :wq
 +
 +리눅스에서 파일을 실행시키기위해서는 실행권한이 있어야 한다
 +    # chmod 0700 test.sh
 +
 +해당 파일을 실행시킨다.
 +    # ./test.sh
 +    bash script  test
 +
 +
 +
 +==== 변수 지정하기 ====
 +
 +위에서 보았던것 처럼 "bash script test"를 다시한번 출력할 것이다 
 +하지만 echo에 바로 지정해서 출력하는것이 아니라 변수를 지정하여 
 +출력하도록 해보자 
 +
 +        # vi var_test.sh
 +        -------------------------------------------
 +        #!/bin/bash
 +        CHARERS="bash script  test"
 +        echo $CHARERS
 +        :wq
 +
 +리눅스에서 파일을 실행시키기위해서는 실행권한이 있어야 한다
 +    #chmod 0700 var_test.sh
 +
 +해당 파일을 실행시킨다.
 +    # ./var_test.sh
 +    bash script  test
 +
 +CHARERS라는 변수가 생성되면서  "bash script  test" 값으로 지정되었다 .
 +주의할점은 echo롤 출력시에  $을 빼버리면  "CHARERS" 단어가 출력된다 
 +그리고 변수지정시  "=" 앞뒤로 공백이 들어가면 안된다.
 +
 +
 +그리고 bash에서도 함수가 있으며 이로인하여 지역변수가 있다 
 +지역변수는 local이라는 명령어를 이용하여 사용한다 
 +간단한예를 설명으로 대신하겠다
 +
 +    # local_var_test.sh
 +    -----------------------------------------------------------------------
 +    #!/bin/bash
 +    CHARERS="bash script test global variables"
 +    function locals {
 +        local CHARERS="bash script test local variables"
 +        echo $CHARERS
 +    }
 +    echo $CHARERS
 +    locals
 +    echo $CHARERS
 +
 +
 +    # ./local_var_test.sh
 +    bash script test global variables
 +    bash script test local variables
 +    bash script test global variables
 +
 +
 +==== 배열 사용하기 ====
 +
 +bash의 최신버전에서는 배열을 지원한다 
 +다차원배열을 지원하지는 않지만 1차원 배열은 지원한다 .
 +특이한점은 중간에 키값이 비어있어도 문제가 되지 않는다 
 +배열의 값을 사용시에는 {}가 필요하다 
 +사용법에 대해 알아보자 
 +
 +    # vi array_test.sh
 +    -----------------------------------------------------------------------
 +    #!/bin/bash
 +
 +    vararray[0]="bash "
 +    vararray[1]="script "
 +    vararray[2]="array "
 +    vararray[3]="test"
 +
 +
 +    echo ${vararray[0]}
 +    echo ${vararray[1]}
 +    echo ${vararray[2]}
 +    echo ${vararray[3]}
 +    echo ${vararray[4]}
 +
 +
 +
 +    -----------------------------------------------------------------------
 +    # ./array_test.sh
 +    bash
 +    script
 +    array
 +    test
 +
 +    -----------------------------------------------------------------------
 +
 +
 +
 +
 +=====비교연산=====
 +
 +분기에 필요한 비교연산자에 대하 간략히 알아보도록하자 
 +
 +
 +==== 비교연산자 ====
 +
 +분기(조건문)에서 조건에 대한 비교를 위해 
 +
 +그리고 다양한 조건의 병합을 위해 사용된다 
 +
 +수 비교 
 +
 +-eq      같다        if [ "$a" -eq "$b" ]
 +-ne      같지 않다    if [ "$a" -ne "$b" ]
 +-gt       초과        if ["$a" -gt "$b" ]
 +-ge      이상        if [ "$a" -ge "$b" ]
 +-lt      미만        if [ "$a" -lt "$b" ]
 +-le      이하        if [ "$a" -le "$b" ]
 +
 +
 +문자열 비교
 +
 += ,==   같다           if [ "$a" = "$b" ]
 +!=       같지 않다    if [ "$a" != "$b" ]
 +-z       문자열이 "null"임. 즉, 길이가 0
 +-n       문자열이 "null"이 아님.
 +
 +기타 비교
 +-f       파일이 존재하는지  확인한다
 +-d        디렉토리가 존재하는 확인한다
 +
 +
 +==== 분기 (if)====
 +
 +분기에 대표적인 것은 if와 switch이다 
 +
 +둘다 조전에 따라 참인지 거짓인지 판별하여 수행하도락 하는 부분이다 
 +
 +먼저 if 에 대해 알아보도록하자 
 +
 +    ------------------------------------------------------------------------------
 +    #!/bin/bash 
 +    if [ "test" = "test" ]; then 
 +        echo "ture"
 +    fi 
 +
 +
 +    print true
 +    ------------------------------------------------------------------------------
 +    #!/bin/bash 
 +    if [ "test" = "test" ]; then 
 +        echo "true"
 +    else 
 +        echo "false"
 +    fi 
 +
 +
 +    print true
 +    -------------------------------------------------------------------------------
 +
 +위의 예는 이해를 돕기 위해 작성한부분이며 
 +
 +실제로는 아래의 형태와 같이  변수와 함께 사용된다 
 +
 +    -------------------------------------------------------------------------------
 +
 +    #!/bin/bash 
 +
 +    test="1"
 +    test1="2"
 +
 +    if [ "$test" = "$test1" ]; then 
 +        echo "true"
 +    else 
 +        echo "false"
 +    fi 
 +
 +
 +    print false
 +    -------------------------------------------------------------------------------
 +
 +
 +==== 분기 (case)====
 +
 +동일한 조건하에  여러가지로 분기를 해야할경우 
 +
 +자주쓰이는  case 문에 대해 알아보자 
 +
 +
 +    -------------------------------------------------------------------------------
 +
 +    #!/bin/bash 
 +
 +    $test="red"
 +
 +    case "$test" in
 +        "red"  
 +            echo "ff0000" ;;
 +        "green"  
 +            echo "00ff00" ;;
 +        "blue")
 +            echo  "0000ff" ;;
 +             *)
 +                    echo "error" ;;
 +    esac
 +
 +
 +    print ff0000
 +    -------------------------------------------------------------------------------
 +
 +각케이스 끝에는  ;;표시하여 분기의 끝점이면 알려주어야한다 .
 +
 +
 +
 +====  간단한 예제====
 +
 +특정 프로세의 수를 세어   10개 이상이면 콘솔상에 특정 문자를 출력하는
 +
 +것에 대해서 알아보자 
 +
 +    -------------------------------------------------------------------------------
 +    #!/bin/bash
 +
 +    process_name="httpd"
 +
 +    process_max_cnt="10"
 +
 +    process_cnt="`ps -ef  | grep $process_name | grep -v "grep" | wc -l`"
 +
 +
 +    if [ "$process_cnt" -gt "$process_max_cnt" ] ; then
 +        echo " $process_name : $process_cnt "
 +    fi
 +    -------------------------------------------------------------------------------
 +
 +위와같이 작성이 된다면  httpd라는 프로세서의 갯수가 10개 초과이라면 
 +
 +해당 스크립트를 실행시킬시에  "httpd : 11" 과 같은 형식으로 출력이 된다 .
 +
 +
 +
 +==== 마무리====
 +
 +이번에는 bash를 용한 쉘 프로그래밍을 하기 위한   분기 및
 +비교 연산자 부분에 대해 알아보았다
 +
 +다른언어에 비해 크게 어렵거나 하지는 않지만 
 +분기문에서 bash쉘 버전에 따라 약간식 오류가 나는부분이 있을수도 있다 
 +이부분은 대부분이 변수 비교 부분에서 "$a" -gt "$g" 이런식으로 "를 
 +이용하면 회피가가능하다 .
 +
 +그리고 쉘프로그래밍은 시스템관리시에 유용하게 많이 사용되며
 +소목적인 반복작업에서 구해줄 친구이다  
 +
 +반복에 대해 알아보자 
 +
 +==== for 구문====
 +일반적으로 사용하는 언어의 for문과 크게 다르지않으며 
 +언어에서 제공하는 것 이외의 다른 기능이 더 추가되어 있다 
 +예를 들자면 특정 문자열의 각 단어를 지마며 끝날때 까지 실행시킬수 있으며 
 +ls등의 명령어로 나온 결과에 따라 각 가인을 지나며 끝날때 까지 실행시킬수 있다 
 +
 +명령행으로 주어진 모든것을 출력
 +    ------------------------------------------------------------------------------
 +    #!/bin/bash
 +
 +     for i in $@  ;do
 +    echo $i
 +     done
 +
 +
 +1에서 100 까지 출력
 +    ------------------------------------------------------------------------------
 +     #!/bin/bash
 +
 +     for i  in $(seq 1 100); do 
 +      echo $i
 +     done
 +
 + 명령으로 주어진 문자열 출력
 +    ------------------------------------------------------------------------------
 +     #!/bin/bash
 +
 +     for i  in $( ls ); do 
 +      echo $i
 +     done
 +  
 +
 +==== while 구문====
 +내부 조건이 참일경우 반복해서 실행시킨다 
 +즉 거짓이되면 더이상 실하아지않고 다음 구분이 시행된다
 +  
 +    ------------------------------------------------------------------------------
 +     #!/bin/bash
 +
 +     i=0
 +     while [ $i -lt 100 ] ; do
 +          echo $i
 +          let i=i+1
 +     done
 +
 +
 +==== until 구문====
 +내부 조건이 거짓일경우 반복해서 실행시킨다
 +즉 참이되면 더이상 실하아지않고 다음 구분이 시행된다
 + 
 +    ------------------------------------------------------------------------------
 +     #!/bin/bash
 +
 +     i=200
 +     until [ $i -lt 100 ] ; do
 +          echo $i
 +          let i=i-10
 +     done
 +
 +
 +리다이렉션와 파이프 그리고 함수에 대해 알아보도록하자 
 +
 +
 +==== 리다이렉션====
 +
 +리다이렉션의 설명에 앞서 먼저 표준 입력과 표준 출력,에러에 대해
 +
 +알아보자  기본적으로 표준  입력과 출력,에러 의 방향은 단반형으로 정해져있다 
 +
 +표준 입력의경우 입력 장치로 부터  프로세서로 전달 되는 방향이며 
 +STDIN (Stanard Input)으로 표기된다 
 +
 +표준 출력의 경우 프로세서에서 출력 장치로 전달되는 방향이며 
 +STDOUT (Standard Output)으로 표기된다 
 +
 +표준 에러의 경우 펴준 출력의 한방식 이며 에로 또는 경고발생시 이용되는 형태이다
 +STDERR (Standard Error)으로 표기된다 
 +
 +
 +그 리고 리다이렉션이란 앞에서 설명한 표준 입력 , 출력 , 에려의 진행방향을 
 +
 +파일로 또는 표준 출력을 표준에러로 와 같이 진행방향을 변경하는것을 의미한다 
 +
 +몇 가지 예를 이용하여 알아보자  
 +   표준 출력을 파일로 
 +    #!/bin/bash
 +        ls > test.log
 +
 +표준에러를  표준출력으로 또는 파일로
 +    #!/bin/bash
 +    grep "http"  /home/ -R  2>
 +
 +    #!/bin/bash
 +    grep "http"  /home/ -R  2> test.log
 +
 +표준 출력,에러 모두를  표준출력으로 또는 파일로
 +    #!/bin/bash
 +    grep "http"  /home/ -R  2>&1
 +    
 +    #!/bin/bash
 +    grep "http"  /home/ -R  &> test.log
 +
 +
 +==== 파이프====
 +파이프는 특정 프로그램의 출력을 입력으로 바꾸어 주는것을 말한다.
 +
 +    #!/bin/bash
 +    ls -al | grep "*.log"
 +    
 +    ls -al 의 결과 출력을 파이프롤 통해서 grep "*.log"의 입력으로 바꾸어준다.
 +
 +
 +==== 함수 ====
 +논리 적인 흐름과 재귀적인 표현등을 위해 함수를 사용가능하다 
 +
 +함수의 사용볍은 function function_name { ..bash script.. }  의 형태로 가능하며 
 +function_name을 호출하는것으로 함수의 호출이 가능하다 
 +그리고 함수에 파라메터를 전달하기 위해서는   함수 호출시 
 +    function_name argv1 argv2 argv3 ... 과 같은 형태로 함수뒤에 파래메타를 입력하고 
 +
 +    function function_name { 
 +     echo $1
 +    echo $2
 +    echo $3
 +    ....
 +    }
 +
 +위와같이 넘겨진 파라메터를 함수 내에서 사용가능하다 
 +
 +    #!/bin/bash
 +    
 +    function tests_1 {
 +        echo "linux.co.kr"
 +    }
 +    
 +    function test_2 {
 +        echo $1
 +    }
 +
 +    test_1            # "linux.co.kr"이 출력된다 
 +
 +    test_2 testargv1    # testargv1가 출력된다.
 +
 +
 +=====대화형 스크립트=====
 + 
 +==== select  구문 ====
 +
 +select 의 경우 사용자에게 리스트형태의 선택 메뉴를 보여주고 해당 메뉴에 대해 번호를 부여하여 번호의 입력으로 해당메뉴의 실행을 가능하게 해준다. 
 +
 +    #!/bin/bash
 +    options="pstree ps quit"
 +
 +    select tmp in $options ; do
 +
 +            if [ "$tmp" = "pstree" ] ; then
 +                    pstree
 +            elif [ "$tmp" = "ps" ] ; then
 +                    ps -ef
 +            elif [ "$tmp" = "quit" ] ; then
 +                    exit
 +            else
 +                    echo bad option
 +            fi
 +
 +    done
 +
 +
 +    =======================
 +
 +    1) pstree
 +    2) ps
 +    3) quit
 +    #? 
 +
 +
 +==== read 구문====
 +
 +프롬프트 상에서 사용자에게 임의의 값을 입력 받을때 사용한 
 +
 +    #!/bin/bash
 +
 +    echo "input 0 ~ 9"
 +
 +    read NUMBER
 +
 +    echo $NUMBER
 +
 +    echo "input [0 ~9]  [a-z]"
 +
 +    read NUMBER CHAR
 +
 +    echo $NUMBER $CHAR
 +
 +    ==================================
 +
 +    input 0 ~ 9
 +    0
 +    0
 +    input [0 ~9]  [a-z]
 +    0 a
 +    0 a
 +
 +
 +
 +=====유용한 명령어들에 대해 알아보자 =====
 +
 +
 +==== 디버깅하기 ====
 +
 +"#!/bin/bash" 를 처음에  "#!/bin/bash -x" 로 해주면 된다 .
 +
 +
 +     -f -X '\''!*.@(pdf|PDF)'\'' acroread gpdf xpdf' ']'
 +    +++ line='complete -f -X '\''!*.@(pdf|PDF)'\'' acroread gpdf xpdf'
 +    +++ line='complete -f -X '\''!*.@(pdf|PDF)'\'' acroread gpdf xpdf'
 +    +++ line=' acroread gpdf xpdf'
 +    +++ list=("${list[@]}" $line)
 +    +++ read line
 +    +++ '[' 'complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf' '!=' 'complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf' ']'
 +    +++ line='complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf'
 +    +++ line='complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf'
 +    +++ line=' kpdf'
 +    +++ list=("${list[@]}" $line)
 +    +++ read line
 +
 +
 +위 와 같이 각 실행 부분에 대해 알려준다 
 +
 +
 +
 +==== 문자열 치환 ====
 +
 +sed  
 +패턴에 따른 문자열 치환 
 +    # sed -e "s/[old_patten]/[new_patten]/g" /path/to/filename
 +
 +공 백 라인 삭제
 +    # sed -e "/^$/d"  /path/to/filename
 +
 +
 +==== 전형화된 파일에서 필드 구분 ====
 +
 +ex) 파일내용   필드 구분자 : \:   row구분자 : \n
 +    root:x:0:0:root:/root:/bin/bash
 +    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
 +    bin:x:2:2:bin:/bin:/bin/sh
 +    sys:x:3:3:sys:/dev:/bin/sh
 +    sync:x:4:65534:sync:/bin:/bin/sync
 +    games:x:5:60:games:/usr/games:/bin/sh
 +    man:x:6:12:man:/var/cache/man:/bin/sh
 +    lp:x:7:7:lp:/var/spool/lpd:/bin/sh
 +    mail:x:8:8:mail:/var/mail:/bin/sh
 +
 +    # awk -F : '{print $1}' /etc/passwd
 +    # cat /etc/passwd | awk -F : '{print $1}'
 +두가지다 아래와 같이 출력된다 
 +    root
 +    daemon
 +    bin
 +    sys
 +    sync
 +    games
 +    man
 +    lp
 +    mail
 +
 +    # cut -d :  -f 1 /etc/passwd
 +    # cat /etc/passwd | cut -d :  -f 1
 +두가지 다 아래와 같이 출력된다 
 +    root
 +    daemon
 +    bin
 +    sys
 +    sync
 +    games
 +    man
 +    lp
 +    mail
 +
 +
 +==== 검색 및 탐색====
 +파일명으로  검색할경우 
 +    find /path/to/ -type f -name [patten]
 +
 +파 일사이즈로  검색할경우 
 +    find /path/to/ -type f -size +1024000
 +
 +파일생성일자로 검색 
 +    find /path/to/ -type f -ctime +24
 +
 +파일내용으로 검색할경우 
 +    grep [patten] /path/to/filename
 +
 +특정디렉토리 아래로 모든파일을  재귀적으로 내용을 검색할때 
 +    grep [patten] /path/to/ -R
 +
 +
 +==== 파일 길이 알아보기 ====
 +각 라인 마다 번호 붙이기 
 +     공백 라인은 제외하고 번호붙이기
 +     nl /path/to/filename 
 +             #!/bin/bash
 +       
 +             for i  in $( ls ) ; do 
 +              echo   "$i\n"
 +             done
 +
 +     공백라인 상관없이 번호붙이기
 +     cat -n  /path/to/filename 
 +             #!/bin/bash
 +        
 +             for i  in $( ls ) ; do 
 +              echo   "$i\n"
 +             done
 +
 +     파일길이에 대한 자센 정보 
 +     wc /path/to/filename 
 +     5 12 74 /path/to/filename
 +     [라인수] [단어수] [문자 수] [파일]
 +
 +
 +6 .  날자 시간 
 +현재 날짜 알아보기 
 +    # date
 +    2010. 05. 16. (일) 18:52:31 KST
 +
 +포멧을 지정할경우 
 +    # date +"%Y%m%d %H%M%S"
 +    20100516 185341
 +
 +특정 프로그램의 실생기산구하기 
 +    # time ls -al
 +
 +    ....
 +    real    0m0.040s
 +    user    0m0.008s
 +    sys    0m0.012s
 + 
 +
 +
 +
  
-{{tag>bash 우분투 유닉스 리눅스 쉘 명령}}