차이

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

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
tech:bash [2014/11/05 04:30] – [변수] 115.93.88.196tech:bash [2016/07/12 09:26] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +{{tag>bash 우분투 유닉스 리눅스 쉘 명령}}
 ====== Bash ====== ====== Bash ======
  
줄 593: 줄 594:
 </file> </file>
  
-{{tag>bash 우분투 스 리스 쉘 명령}}+ 
 + 
 + 
 +=====강좌===== 
 + 
 +  
 + 
 +==== 간단한 텍스트 출력하기 ==== 
 + 
 +우선 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>1  
 + 
 +    #!/bin/bash 
 +    grep "http"  /home/ -R  2> test.log 
 + 
 +표준 출력,에러 모두를  표준출력으로 또는 파일로 
 +    #!/bin/bash 
 +    grep "http"  /home/ -R  2>&
 +     
 +    #!/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 
 +  
 + 
 + 
 +