차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 다음 판 | 이전 판 | ||
| tech:bash [2014/10/31 04:50] – 만듦 V_L | tech:bash [2016/07/12 00:56] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| + | {{tag> | ||
| ====== Bash ====== | ====== Bash ====== | ||
| 줄 41: | 줄 42: | ||
| =====변수 ===== | =====변수 ===== | ||
| - | 변수는 컴퓨터의 기억 장소 안의 이름 붙여진 저장 위치이다. 여러분이 하나의 변수를 정의할 때, 이 위치에는 그 변수의 정의된 값이 있게 된다[역자 주: 변수를 상자 A라고 불리는 상자라고 생각하자. 예를 들어 여러분이 상자 A에 공을 넣었다 하자. 그러면 상자 A의 값은 공이다]. bash 에는 환경 변수와 지역 변수, 이렇게 두 가지 타입의 변수가 있다. 환경 변수는 시스템에 의해 생성된 것이고 일반적으로 / | + | 변수는 컴퓨터의 기억 장소 안의 이름 붙여진 저장 위치이다. 여러분이 하나의 변수를 정의할 때, 이 위치에는 그 변수의 정의된 값이 있게 된다[역자 주: 변수를 상자 A라고 불리는 상자라고 생각하자. 예를 들어 여러분이 상자 A에 공을 넣었다 하자. 그러면 상자 A의 값은 공이다]. bash 에는 환경 변수와 지역 변수, 이렇게 두 가지 타입의 변수가 있다. |
| + | |||
| + | 환경 변수는 시스템에 의해 생성된 것이고 일반적으로 / | ||
| + | |||
| + | 지역 변수는 사용자에 의해서 정의되는 것으로 대개 ~/.bashrc 같은 지역적인 설정 파일에 위치한다. 이들은 bash 가 수행될 때 오직 그 사용자에게만 한정되어진다[역자 주: 환경 변수는 bash를 실행하는 모든 사람에게 영향을 주는 반면, 지역 변수는 자신의 지역적인 설정 파일에 그것을 명시한 사용자들에게만 영향을 준다]. | ||
| ====변수 정의하기 ==== | ====변수 정의하기 ==== | ||
| 줄 580: | 줄 585: | ||
| </ | </ | ||
| + | =====파일 만들기===== | ||
| + | < | ||
| + | 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> | ||