차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판마지막 판양쪽 다음 판 | ||
tech:bash [2014/10/31 13:50] – 만듦 V_L | tech:bash [2015/02/24 07:32] – V_L | ||
---|---|---|---|
줄 41: | 줄 41: | ||
=====변수 ===== | =====변수 ===== | ||
- | 변수는 컴퓨터의 기억 장소 안의 이름 붙여진 저장 위치이다. 여러분이 하나의 변수를 정의할 때, 이 위치에는 그 변수의 정의된 값이 있게 된다[역자 주: 변수를 상자 A라고 불리는 상자라고 생각하자. 예를 들어 여러분이 상자 A에 공을 넣었다 하자. 그러면 상자 A의 값은 공이다]. bash 에는 환경 변수와 지역 변수, 이렇게 두 가지 타입의 변수가 있다. 환경 변수는 시스템에 의해 생성된 것이고 일반적으로 / | + | 변수는 컴퓨터의 기억 장소 안의 이름 붙여진 저장 위치이다. 여러분이 하나의 변수를 정의할 때, 이 위치에는 그 변수의 정의된 값이 있게 된다[역자 주: 변수를 상자 A라고 불리는 상자라고 생각하자. 예를 들어 여러분이 상자 A에 공을 넣었다 하자. 그러면 상자 A의 값은 공이다]. bash 에는 환경 변수와 지역 변수, 이렇게 두 가지 타입의 변수가 있다. |
+ | |||
+ | 환경 변수는 시스템에 의해 생성된 것이고 일반적으로 / | ||
+ | |||
+ | 지역 변수는 사용자에 의해서 정의되는 것으로 대개 ~/.bashrc 같은 지역적인 설정 파일에 위치한다. 이들은 bash 가 수행될 때 오직 그 사용자에게만 한정되어진다[역자 주: 환경 변수는 bash를 실행하는 모든 사람에게 영향을 주는 반면, 지역 변수는 자신의 지역적인 설정 파일에 그것을 명시한 사용자들에게만 영향을 준다]. | ||
====변수 정의하기 ==== | ====변수 정의하기 ==== | ||
줄 580: | 줄 584: | ||
</ | </ | ||
+ | =====파일 만들기===== | ||
+ | < | ||
+ | You might try echo | ||
+ | |||
+ | #!/bin/sh | ||
+ | echo " | ||
+ | echo "Hello Bob" > / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | =====강좌===== | ||
+ | |||
+ | |||
+ | |||
+ | ==== 간단한 텍스트 출력하기 ==== | ||
+ | |||
+ | 우선 bash에서 가장 간단하게 출력 가능한 echo를 이용하여 | ||
+ | |||
+ | "bash script test" | ||
+ | |||
+ | # vi test.sh | ||
+ | ------------------------------------------- | ||
+ | #!/bin/bash | ||
+ | echo "bash script | ||
+ | :wq | ||
+ | |||
+ | 리눅스에서 파일을 실행시키기위해서는 실행권한이 있어야 한다 | ||
+ | # chmod 0700 test.sh | ||
+ | |||
+ | 해당 파일을 실행시킨다. | ||
+ | # ./test.sh | ||
+ | bash script | ||
+ | |||
+ | |||
+ | |||
+ | ==== 변수 지정하기 ==== | ||
+ | |||
+ | 위에서 보았던것 처럼 "bash script test" | ||
+ | 하지만 echo에 바로 지정해서 출력하는것이 아니라 변수를 지정하여 | ||
+ | 출력하도록 해보자 | ||
+ | |||
+ | # vi var_test.sh | ||
+ | ------------------------------------------- | ||
+ | #!/bin/bash | ||
+ | CHARERS=" | ||
+ | echo $CHARERS | ||
+ | :wq | ||
+ | |||
+ | 리눅스에서 파일을 실행시키기위해서는 실행권한이 있어야 한다 | ||
+ | #chmod 0700 var_test.sh | ||
+ | |||
+ | 해당 파일을 실행시킨다. | ||
+ | # ./ | ||
+ | bash script | ||
+ | |||
+ | CHARERS라는 변수가 생성되면서 | ||
+ | 주의할점은 echo롤 출력시에 | ||
+ | 그리고 변수지정시 | ||
+ | |||
+ | |||
+ | 그리고 bash에서도 함수가 있으며 이로인하여 지역변수가 있다 | ||
+ | 지역변수는 local이라는 명령어를 이용하여 사용한다 | ||
+ | 간단한예를 설명으로 대신하겠다 | ||
+ | |||
+ | # local_var_test.sh | ||
+ | ----------------------------------------------------------------------- | ||
+ | #!/bin/bash | ||
+ | CHARERS=" | ||
+ | function locals { | ||
+ | local CHARERS=" | ||
+ | echo $CHARERS | ||
+ | } | ||
+ | echo $CHARERS | ||
+ | locals | ||
+ | echo $CHARERS | ||
+ | |||
+ | |||
+ | # ./ | ||
+ | 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]=" | ||
+ | vararray[1]=" | ||
+ | vararray[2]=" | ||
+ | vararray[3]=" | ||
+ | |||
+ | |||
+ | echo ${vararray[0]} | ||
+ | echo ${vararray[1]} | ||
+ | echo ${vararray[2]} | ||
+ | echo ${vararray[3]} | ||
+ | echo ${vararray[4]} | ||
+ | |||
+ | |||
+ | |||
+ | ----------------------------------------------------------------------- | ||
+ | # ./ | ||
+ | bash | ||
+ | script | ||
+ | array | ||
+ | test | ||
+ | |||
+ | ----------------------------------------------------------------------- | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | =====비교연산===== | ||
+ | |||
+ | 분기에 필요한 비교연산자에 대하 간략히 알아보도록하자 | ||
+ | |||
+ | |||
+ | ==== 비교연산자 ==== | ||
+ | |||
+ | 분기(조건문)에서 조건에 대한 비교를 위해 | ||
+ | |||
+ | 그리고 다양한 조건의 병합을 위해 사용된다 | ||
+ | |||
+ | 수 비교 | ||
+ | |||
+ | -eq 같다 | ||
+ | -ne 같지 않다 | ||
+ | -gt | ||
+ | -ge 이상 | ||
+ | -lt 미만 | ||
+ | -le 이하 | ||
+ | |||
+ | |||
+ | 문자열 비교 | ||
+ | |||
+ | = ,== | ||
+ | != | ||
+ | -z | ||
+ | -n | ||
+ | |||
+ | 기타 비교 | ||
+ | -f | ||
+ | -d 디렉토리가 존재하는 확인한다 | ||
+ | |||
+ | |||
+ | ==== 분기 (if)==== | ||
+ | |||
+ | 분기에 대표적인 것은 if와 switch이다 | ||
+ | |||
+ | 둘다 조전에 따라 참인지 거짓인지 판별하여 수행하도락 하는 부분이다 | ||
+ | |||
+ | 먼저 if 에 대해 알아보도록하자 | ||
+ | |||
+ | ------------------------------------------------------------------------------ | ||
+ | # | ||
+ | if [ " | ||
+ | echo " | ||
+ | fi | ||
+ | |||
+ | |||
+ | print true | ||
+ | ------------------------------------------------------------------------------ | ||
+ | # | ||
+ | if [ " | ||
+ | echo " | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | |||
+ | |||
+ | print true | ||
+ | ------------------------------------------------------------------------------- | ||
+ | |||
+ | 위의 예는 이해를 돕기 위해 작성한부분이며 | ||
+ | |||
+ | 실제로는 아래의 형태와 같이 | ||
+ | |||
+ | ------------------------------------------------------------------------------- | ||
+ | |||
+ | # | ||
+ | |||
+ | test=" | ||
+ | test1=" | ||
+ | |||
+ | if [ " | ||
+ | echo " | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | |||
+ | |||
+ | print false | ||
+ | ------------------------------------------------------------------------------- | ||
+ | |||
+ | |||
+ | ==== 분기 (case)==== | ||
+ | |||
+ | 동일한 조건하에 | ||
+ | |||
+ | 자주쓰이는 | ||
+ | |||
+ | |||
+ | ------------------------------------------------------------------------------- | ||
+ | |||
+ | # | ||
+ | |||
+ | $test=" | ||
+ | |||
+ | case " | ||
+ | " | ||
+ | echo " | ||
+ | " | ||
+ | echo " | ||
+ | " | ||
+ | echo " | ||
+ | *) | ||
+ | echo " | ||
+ | esac | ||
+ | |||
+ | |||
+ | print ff0000 | ||
+ | ------------------------------------------------------------------------------- | ||
+ | |||
+ | 각케이스 끝에는 | ||
+ | |||
+ | |||
+ | |||
+ | ==== 간단한 예제==== | ||
+ | |||
+ | 특정 프로세의 수를 세어 | ||
+ | |||
+ | 것에 대해서 알아보자 | ||
+ | |||
+ | ------------------------------------------------------------------------------- | ||
+ | #!/bin/bash | ||
+ | |||
+ | process_name=" | ||
+ | |||
+ | process_max_cnt=" | ||
+ | |||
+ | process_cnt=" | ||
+ | |||
+ | |||
+ | if [ " | ||
+ | echo " $process_name : $process_cnt " | ||
+ | fi | ||
+ | ------------------------------------------------------------------------------- | ||
+ | |||
+ | 위와같이 작성이 된다면 | ||
+ | |||
+ | 해당 스크립트를 실행시킬시에 | ||
+ | |||
+ | |||
+ | |||
+ | ==== 마무리==== | ||
+ | |||
+ | 이번에는 bash를 용한 쉘 프로그래밍을 하기 위한 | ||
+ | 비교 연산자 부분에 대해 알아보았다 | ||
+ | |||
+ | 다른언어에 비해 크게 어렵거나 하지는 않지만 | ||
+ | 분기문에서 bash쉘 버전에 따라 약간식 오류가 나는부분이 있을수도 있다 | ||
+ | 이부분은 대부분이 변수 비교 부분에서 " | ||
+ | 이용하면 회피가가능하다 . | ||
+ | |||
+ | 그리고 쉘프로그래밍은 시스템관리시에 유용하게 많이 사용되며 | ||
+ | 소목적인 반복작업에서 구해줄 친구이다 | ||
+ | |||
+ | 반복에 대해 알아보자 | ||
+ | |||
+ | ==== for 구문==== | ||
+ | 일반적으로 사용하는 언어의 for문과 크게 다르지않으며 | ||
+ | 언어에서 제공하는 것 이외의 다른 기능이 더 추가되어 있다 | ||
+ | 예를 들자면 특정 문자열의 각 단어를 지마며 끝날때 까지 실행시킬수 있으며 | ||
+ | ls등의 명령어로 나온 결과에 따라 각 가인을 지나며 끝날때 까지 실행시킬수 있다 | ||
+ | |||
+ | 명령행으로 주어진 모든것을 출력 | ||
+ | ------------------------------------------------------------------------------ | ||
+ | #!/bin/bash | ||
+ | |||
+ | for i in $@ ;do | ||
+ | echo $i | ||
+ | done | ||
+ | |||
+ | |||
+ | 1에서 100 까지 출력 | ||
+ | ------------------------------------------------------------------------------ | ||
+ | # | ||
+ | |||
+ | for i in $(seq 1 100); do | ||
+ | echo $i | ||
+ | done | ||
+ | |||
+ | | ||
+ | ------------------------------------------------------------------------------ | ||
+ | # | ||
+ | |||
+ | for i in $( ls ); do | ||
+ | echo $i | ||
+ | done | ||
+ | | ||
+ | |||
+ | ==== while 구문==== | ||
+ | 내부 조건이 참일경우 반복해서 실행시킨다 | ||
+ | 즉 거짓이되면 더이상 실하아지않고 다음 구분이 시행된다 | ||
+ | | ||
+ | ------------------------------------------------------------------------------ | ||
+ | # | ||
+ | |||
+ | i=0 | ||
+ | while [ $i -lt 100 ] ; do | ||
+ | echo $i | ||
+ | let i=i+1 | ||
+ | done | ||
+ | |||
+ | |||
+ | ==== until 구문==== | ||
+ | 내부 조건이 거짓일경우 반복해서 실행시킨다 | ||
+ | 즉 참이되면 더이상 실하아지않고 다음 구분이 시행된다 | ||
+ | |||
+ | ------------------------------------------------------------------------------ | ||
+ | # | ||
+ | |||
+ | 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 " | ||
+ | |||
+ | #!/bin/bash | ||
+ | grep " | ||
+ | |||
+ | 표준 출력, | ||
+ | #!/bin/bash | ||
+ | grep " | ||
+ | | ||
+ | #!/bin/bash | ||
+ | grep " | ||
+ | |||
+ | |||
+ | ==== 파이프==== | ||
+ | 파이프는 특정 프로그램의 출력을 입력으로 바꾸어 주는것을 말한다. | ||
+ | |||
+ | #!/bin/bash | ||
+ | ls -al | grep " | ||
+ | | ||
+ | ls -al 의 결과 출력을 파이프롤 통해서 grep " | ||
+ | |||
+ | |||
+ | ==== 함수 ==== | ||
+ | 논리 적인 흐름과 재귀적인 표현등을 위해 함수를 사용가능하다 | ||
+ | |||
+ | 함수의 사용볍은 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 " | ||
+ | } | ||
+ | | ||
+ | function test_2 { | ||
+ | echo $1 | ||
+ | } | ||
+ | |||
+ | test_1 | ||
+ | |||
+ | test_2 testargv1 | ||
+ | |||
+ | |||
+ | =====대화형 스크립트===== | ||
+ | |||
+ | ==== select | ||
+ | |||
+ | select 의 경우 사용자에게 리스트형태의 선택 메뉴를 보여주고 해당 메뉴에 대해 번호를 부여하여 번호의 입력으로 해당메뉴의 실행을 가능하게 해준다. | ||
+ | |||
+ | #!/bin/bash | ||
+ | options=" | ||
+ | |||
+ | select tmp in $options ; do | ||
+ | |||
+ | if [ " | ||
+ | pstree | ||
+ | elif [ " | ||
+ | ps -ef | ||
+ | elif [ " | ||
+ | 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 | ||
+ | |||
+ | |||
+ | |||
+ | =====유용한 명령어들에 대해 알아보자 ===== | ||
+ | |||
+ | |||
+ | ==== 디버깅하기 ==== | ||
+ | |||
+ | "# | ||
+ | |||
+ | |||
+ | -f -X ' | ||
+ | +++ line=' | ||
+ | +++ line=' | ||
+ | +++ line=' acroread gpdf xpdf' | ||
+ | +++ list=(" | ||
+ | +++ read line | ||
+ | +++ ' | ||
+ | +++ line=' | ||
+ | +++ line=' | ||
+ | +++ line=' kpdf' | ||
+ | +++ list=(" | ||
+ | +++ read line | ||
+ | |||
+ | |||
+ | 위 와 같이 각 실행 부분에 대해 알려준다 | ||
+ | |||
+ | |||
+ | |||
+ | ==== 문자열 치환 ==== | ||
+ | |||
+ | sed | ||
+ | 패턴에 따른 문자열 치환 | ||
+ | # sed -e " | ||
+ | |||
+ | 공 백 라인 삭제 | ||
+ | # sed -e "/ | ||
+ | |||
+ | |||
+ | ==== 전형화된 파일에서 필드 구분 ==== | ||
+ | |||
+ | ex) 파일내용 | ||
+ | root: | ||
+ | daemon: | ||
+ | bin: | ||
+ | sys: | ||
+ | sync: | ||
+ | games: | ||
+ | man: | ||
+ | lp: | ||
+ | mail: | ||
+ | |||
+ | # awk -F : ' | ||
+ | # cat /etc/passwd | awk -F : ' | ||
+ | 두가지다 아래와 같이 출력된다 | ||
+ | root | ||
+ | daemon | ||
+ | bin | ||
+ | sys | ||
+ | sync | ||
+ | games | ||
+ | man | ||
+ | lp | ||
+ | |||
+ | |||
+ | # cut -d : -f 1 /etc/passwd | ||
+ | # cat /etc/passwd | cut -d : -f 1 | ||
+ | 두가지 다 아래와 같이 출력된다 | ||
+ | root | ||
+ | daemon | ||
+ | bin | ||
+ | sys | ||
+ | sync | ||
+ | games | ||
+ | man | ||
+ | lp | ||
+ | |||
+ | |||
+ | |||
+ | ==== 검색 및 탐색==== | ||
+ | 파일명으로 | ||
+ | find /path/to/ -type f -name [patten] | ||
+ | |||
+ | 파 일사이즈로 | ||
+ | find /path/to/ -type f -size +1024000 | ||
+ | |||
+ | 파일생성일자로 검색 | ||
+ | find /path/to/ -type f -ctime +24 | ||
+ | |||
+ | 파일내용으로 검색할경우 | ||
+ | grep [patten] / | ||
+ | |||
+ | 특정디렉토리 아래로 모든파일을 | ||
+ | grep [patten] /path/to/ -R | ||
+ | |||
+ | |||
+ | ==== 파일 길이 알아보기 ==== | ||
+ | 각 라인 마다 번호 붙이기 | ||
+ | | ||
+ | nl / | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | cat -n / | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | wc / | ||
+ | 5 12 74 / | ||
+ | | ||
+ | |||
+ | |||
+ | 6 . 날자 시간 | ||
+ | 현재 날짜 알아보기 | ||
+ | # date | ||
+ | 2010. 05. 16. (일) 18:52:31 KST | ||
+ | |||
+ | 포멧을 지정할경우 | ||
+ | # date +" | ||
+ | 20100516 185341 | ||
+ | |||
+ | 특정 프로그램의 실생기산구하기 | ||
+ | # time ls -al | ||
+ | |||
+ | .... | ||
+ | real 0m0.040s | ||
+ | user 0m0.008s | ||
+ | sys 0m0.012s | ||
+ | |||
+ | |||
+ | |||
{{tag> | {{tag> |