Linux/Unix2009. 8. 11. 17:29

쉘 스크립트를 작성하려는 프로그래머를 위한 bash 프로그래밍 요약이다. 이 글의 목적은 프로그래밍을 가르치는 데에 있지 않다. 이미 하나의 프로그래밍 언어를 알고 있으면서 bash 스크립팅을 배우려고 하는 사람들을 위한 것이다.

프로그래밍의 기초

모든 bash 스크립트는 반드시 o/s에게 인터프리터로 무엇을 쓸 것이지 알려야 한다. 모든 스크립트의 첫번째 라인은 다음과 같아야 한다:
#!/bin/bash

다음 명령으로bash 스크립트를 실행 가능하게 만들어야 한다.
chmod +x filename

변수

변수를 만들어 값을 대입한다. 변수에는 데이터 타입이 없다(다른 언어에서처럼 변수의 타입을 정의하지 않고도 변수의 값으로 문자열, 숫자 등을 가진다).
varname=value

변수 값에 접근할 때는 변수 이름 앞에 $를 붙인다
echo $varname

명령 라인에서 인자로서 넘겨진 값은 $#를 통해 접근할 수 있다. 여기서 #는 넘겨진 값들의 배열 중 그 값의 인덱스이다. 이 배열은 1부터 시작한다.
command var1 var2 var3 .... varX
$1은 var1이 무엇이든지 그 값을 나타내며, $2는 var2의 값을 나타낸다. 나머지도 마찬가지이다.

내부에 정의된 변수들:

변수

용도

$1-$N

명령 라인으로부터 프로그램에 넘겨진 인자(변수) 저장한다.

$?

마지막 명령이 실행되었을 때의 탈출 값을 저장한다.

$0

입력된 명령의 첫번째 단어( 프로그램의 이름) 저장한다.

$*

명령 라인에서 입력된 모든 인자들(($1 $2 …) 저장한다.

"$@"

명령 라인에서 입력된 모든 인자들을 개별적으로 따옴표를 씌운 형태("$1" "$2" ...) 저장한다.

인용 부호

보통의 따옴표("like these")는 쉘이 공백 문자를 무시하도록 해서 넘겨진 하나의 인자 또는 사용할 문자열로 생각하게 한다. 하지만 따옴표 안의 특수 문자는 인식한다.

작은 따옴표('like this')는 어떤 문자열이 넘겨지든 간에 쉘이 모든 특수 문자를 무시해서 해석하도록 한다.

역 따옴표(`command`)는 다른 기능을 한다. 한 명령의 결과를 다른 명령에서 사용하고 싶을 때 역 따옴표를 사용한다. 예를 들어, 변수 contents 의 값을 현재 디렉토리 안에 있는 파일의 리스트와 같게 하고 싶다면 다음과 같은 명령을 입력하면 된다: contents=`ls`. ls 프로그램의 결과가 변수 contents에 들어 간다.

논리와 비교

루프에의 입장/탈출 조건을 체크하는 if-then 문장과 같은 조건 연산식의 계산에는 test라 불리는 명령이 사용된다.

test expression
또는
[ expression ]

>

수치 비교

int1 -eq int2

int1 int2 같다면 True 리턴한다.

int1 -ge int2

int1 int2보다 크거나 같으면 True 리턴한다.

int1 -gt int2

int1 int2보다 크면 True 리턴한다.

int1 -le int2

int1 int2보다 작거나 같으면 True 리턴한다.

int1 -lt int2

int1 int2보다 작으면 True 리턴한다.

int1 -ne int2

int1 int2 다르면 True 리턴한다.

 

문자열 비교

str1 = str2

str1 str2 일치하면 True 리턴한다.

str1 != str2

str1 str2 다르면 True 리턴한다.

str

str null 아니면 True 리턴한다.

-n str

str 길이가 0보다 크면 True 리턴한다.

-z str

str 길이가 0 같으면 True 리턴한다.(길이가 0 것은 null 다르다)

 

파일 비교

-d filename

파일 filename 디렉토리면 True 리턴한다.

-f filename

파일 filename 일반적인 파일이면 True 리턴한다.

-r filename

파일 filename 프로세스에 의해 읽혀진다면 True 리턴한다.

-s filename

파일 filename 길이가 0 아니면 True 리턴한다.

-w filename

파일 filename 프로세스에 의해 쓰여질 있다면 True 리턴한다.

-x filename

파일 filename 수행 가능하다면 True 리턴한다.

 

표현식 비교

!expression

expression true 아니면 true 리턴한다.

expr1 -a expr2

expr1 expr2 true이면 true 리턴한다. ( && , and )

expr1 -o expr2

expr1이나 expr2 적어도 하나가 true이면 true 리턴한다. ( ||, or )

 

논리(이어서)

If...then

if [ expression ]
        then
                commands
fi
 

If..then...else

if [ expression ]
        then
                commands
        else
                commands
fi
 

If..then...else If...else

 
if [ expression ]
        then
                commands
elif [ expression2 ]
        then
                commands
else
                commands
fi

Case select

case string1 in
        str1)
                commands;;
        str2)
                commands;;
        *)
                commands;;
esac
 

string1은str1, str2와 비교된다. 만일 이 중 하나가 string1과 일치한다면, 이중 세미콜론이 나올 때까지 commands가 실행된다. 만일 어느 것도 string1과 일치하지 않는다면, *에 해당하는 commands가 실행된다. 이것은 디폴트 경우로, *가 모든 문자열에 해당하기 때문이다.

반복(루프, loop)

 
for var1 in list
do
        commands
done

이것은 list 안의 각 항목에 대해 한번씩 실행된다. 이 list는 공백 문자로 구분된 여러 개의 단어를 담고 있는 변수(ls나 cat 명령의 출력과 같은)일 수 있다. 또는 문장에 직접 입력된 값들의 리스트일 수도 있다. 루프를 돌 때마다, 변수 var1에는 리스트의 항목 중 현재 항목이 대입되는데 마지막 항목에 이를 때까지 계속 반복된다.

 
while [ expression ]
do
        commands
done
 
until [ expression ]
do
        commands
done
 

함수

함수 만드는 법:

fname(){
        commands
}
 

함수를 부를 땐 다음의 문법을 사용한다: fname

인자를 받아들이는 함수 만들기:

fname2 (arg1,arg2...argN){
        commands
}

인자 있는 함수 부르는 법: fname2 arg1 arg2 ... argN

 


오늘은 계속 퍼오기만... 
출처: http://coffeenix.net/doc/shell/bash_cheat.htm
원문: http://www.linuxnewbie.org/nhf/intel/programming/bash_cheat.html
Posted by 샤키
취미2009. 8. 8. 15:14


1. 테스트메뉴 : #7583538324#8378#
GPS Port Map - UARTI의 Device : DM Service
         - DM의 Service : USB DIAG Device



2. QPST와 wmrmake을 통하여 게임넣기
registry.dat : wipi - sys
menu1.dat : wipi - sys -wam
게임 저장하는곳 : wipi -ctn


여기에 필요한 프로그램은 스사모 (http://skysamo.com) 에서...
가끔 게임 넣고 싶을때 까묵어서 이렇게 포스팅을 해놓을려고.. +_+


PS : 혹시나 동영상보고 따라 하시려는분은 KTF, LGT는 안된다고 하네요
   (ex U160K, U160L 모델


출처 : http://cafe.daum.net/u160
Posted by 샤키
Linux/Unix2009. 8. 7. 14:28

오늘 해커스쿨 운동장(?)에서 놀다 보니 2>/dev/null 관련된 문제가 있었다

   

일단 문제는 역시 내 수준하고는..... 너무 어려워 ㅜㅜ

   

암튼 그래서 먼저 풀어 보신분들의 해답(?)등을 참고 하다보니 위에 같은 명령어가 나오길래...

   

/dev/null 알겠는데...

   

1>/dev/null

2>/dev/null

   

은 처음 보는거라 생소 했다.. 그래서 네이버에게 물어보니 이러한 답변이...

   

A.

   

B.

   

C.

   

일단 A와 B은 같은 의미

   

그럼 B와 C의 차이는 뭐냐

   

1의 의미는 STDOUT(standard output)

2의 의미는 STRERR(standard error)

   

STDOUT은 표준출력으로, 정상적인 메시지를 출력하고

STDERR은 표준에러로, 에러메시지를 출력하는것이다

   

다시 말해

B는 표준출력을 /dev/null로 redirection하고 (정상적인 메시지를 null로)

C는 표준에러를 /dev/null로 redirection 한다 (에러메시지를 null로)

   

정상적인 메시지는 안보인다

   

위와 다르게 Permission denied인 에러메시지들은 안보인다

   

   

표준출력, 표준에러 그리고 표준입력도 있는데 이것을 리눅에서는 "파일"이라고 부른다.

   

   



PS: /dev/null 자체를 모르시는 분도 계실듯..

나는 이것을 쉽게 생각해서 "블랙홀"이라고 배웠다

이파일에 쓰는 모든것은 영원히 사라진다는것으로 아무것도 아닌(null) 장치파일이라고 볼수 있다(?)

어떠한 작업의 출력되는 내용을 보고 싶지 않을때, 이곳으로 그 출력을 보내버리면,

아무것도 보여지지 않게 되는것이다. 이럴때 아주 유용하게 쓰이게 된다

파일을 지울때는 rm 명령어로 지우면 되겠지만 텍스트로 이루어진 로그파일이라도

그 로그파일이 시스템에서 사용중일수 있다 그러면 삭제하는것은 위험 하기 때문에

그럴때

"/dev/null > 로그파일.log"

위와 같이 해주면 로그파일의 속(?)을 비워주게 되는것이다.

   

Posted by 샤키
Linux/Unix2009. 8. 6. 12:10

   

Linux 및 Unix 계열 편집기인 vi에서 옆에 숫자 라인 나오게 하려면

   

:set nu를 치면

   

이와 같이 라인이 보인다

   

다시 없애려면 :set nonu를 사용하면 된다

   

다시 없애진것을 볼수 있다

   

자주 까먹는 명령어는 이런식 으로 포스팅 해야 겠음

Posted by 샤키
Linux/Unix2009. 8. 5. 12:06

리눅스를 배포하거나 오픈 소스를 배포 하는곳을 가보면 미러 사이트가 링크 되어 있는것을 볼수 있을것이다

이러한 미러 사이트는 주 사이트의 데이터를 그대로 복사해와 주사이트와 동일한 서비스를 제공 하는 것이다

원격 서버의 데이터를 복사해 와서 원본과 동일한 데이터 상태를 유지하는 것을 미러링(mirroring) 혹은

서버 동기화 (server syncronization)라고 한다

   

이러한 미러링을 가능 하게 해주는 것이 rsync다 쉽게 말해 rsync는 여러 대의 서버들이 동일한 정보를 가질 수 있도록 해주는 서버 동기화 프로그램이라 할수 있는데 원격지 시스템으로의 백업에도 응용할 수 있다

   

패키지가 설치 되어 있는지 확인 한다

CentOS 경우 4.7이상이면 별도 설치 필요 없이 설치가 되어 있을 것이다

   

rsync는 ssh를 사용할수도 있고 임의적으로 873포트를 사용 할 수도 있다

   

873포트는 위와 같이 테스트 해볼 수 있다 포트가 위와 같이 열리지 않았다면

   

chkconfig rsync on을 사용하여 동작을 시킬 수도 있다

하지만 제 경우 보안(?)을 위해 ssh만으로 사용 했다

   

   



사용방법

# rsync [option] [rsync 서버]:[서비스명] [다운로드할 위치]

   

option

-a : archive mode (심볼릭 링크, 속성, 퍼미션, 소유권 등 보존)

-r : 하위 디렉토리 포함

--delete : 서버 동기화 후 rsync 서버에서 파일이 삭제되었으면, 클라이언트도 대상 파일을 삭제하는 옵션

-v : verbose mode (자세한 정보 출력)

-z : compress (전송시 압축)

-e ssh : ssh를 이용한 rsync 동기화

--no-l : 심볼릭링크은 제외하고 동기화

   

동기화를 해본 예... 아래에 속도까지 표시 된다

   

파일을 지우고 동기화를 해보자

   

동기화 하면서 알아서 삭제 해주는 것을 볼수 있다

   

이와 같이 rsync는 백업 하는데 많이 사용한다

Posted by 샤키
Linux/Unix2009. 8. 5. 11:17

밑으로
#! /bin/bash
echo "구구단"
        for((i=2;i<=5;i++))
                do
                for((j=1;j<=9;j++))
                        do
                num=`expr $i \* $j`
                echo " $i X $j = $num "
                        done
                echo ""
                done

2 X 1 = 2
 2 X 2 = 4
 2 X 3 = 6
 2 X 4 = 8
 2 X 5 = 10
 2 X 6 = 12
 2 X 7 = 14
 2 X 8 = 16
 2 X 9 = 18

 3 X 1 = 3
 3 X 2 = 6
 3 X 3 = 9
 3 X 4 = 12
 3 X 5 = 15
 3 X 6 = 18
 3 X 7 = 21
 3 X 8 = 24
 3 X 9 = 27

 4 X 1 = 4
 4 X 2 = 8
 4 X 3 = 12
 4 X 4 = 16
 4 X 5 = 20
 4 X 6 = 24
 4 X 7 = 28
 4 X 8 = 32
 4 X 9 = 36

 5 X 1 = 5
 5 X 2 = 10
 5 X 3 = 15
 5 X 4 = 20
 5 X 5 = 25
 5 X 6 = 30
 5 X 7 = 35
 5 X 8 = 40
 5 X 9 = 45

옆으로
#! /bin/bash
echo "구구단"
        for((i=1;i<=9;i++))
                do
                for((j=2;j<=5;j++))
                        do
                num=`expr $j \* $i`
                echo -n " $j X $i = $num  "
                        done
                echo ""
                done

 2 X 1 = 2   3 X 1 = 3   4 X 1 = 4   5 X 1 = 5 
 2 X 2 = 4   3 X 2 = 6   4 X 2 = 8   5 X 2 = 10 
 2 X 3 = 6   3 X 3 = 9   4 X 3 = 12   5 X 3 = 15 
 2 X 4 = 8   3 X 4 = 12   4 X 4 = 16   5 X 4 = 20 
 2 X 5 = 10   3 X 5 = 15   4 X 5 = 20   5 X 5 = 25 
 2 X 6 = 12   3 X 6 = 18   4 X 6 = 24   5 X 6 = 30 
 2 X 7 = 14   3 X 7 = 21   4 X 7 = 28   5 X 7 = 35 
 2 X 8 = 16   3 X 8 = 24   4 X 8 = 32   5 X 8 = 40 
 2 X 9 = 18   3 X 9 = 27   4 X 9 = 36   5 X 9 = 45

Posted by 샤키
Linux/Unix2009. 8. 5. 11:12

언어 중에 for문을 이해 하는데 별모양 만들기만한게 없을것이다
근데 많은 언어중 shell 이냐면 
요즘 쉘스크립트를 공부중이라 예전 기억을 살려서 C로 해본것을 쉘스크립트로 작성해보는중이다

#! /bin/bash       
                for((i=0;i<9;i++))
                do
                for((j=0;j<i+1;j++))
                        do
                echo -n "*"
                        done
                echo ""
                done

출력
*
**
***
****
*****
******
*******
********
*********


#! /bin/bash

        for((i=9;i>0;i--))
                do
                for((j=1;j<i+1;j++))
                        do
                echo -n "*"
                        done
                echo ""
                done

출력
*********
********
*******
******
*****
****
***
**
*


계속 업데이트 중....

Posted by 샤키
Linux/Unix2009. 6. 4. 11:41
어느날 자신이 작성 스크립트를 unix계열에서 실행 하였는데 아래와 같이 에러가 발생한다면


작성한 스크립트가 dos나 windows계열에서 작성한 스크립트라면 백프롭니다 ㅋ (개콘 ver.)

unix계열과 dos의 문서는 다른 표준규격을 사용한다고 해서 호환이 안되서 그렇다고...  (맞나..)
암튼 리눅스나 unix에서 dos계열 문서를변환 해주는 툴이 있네요 자세한 설명은 나도 잘...




사용방법은 간단

dos2unix file명

해주면 알아서 끝
실행 해보면 위와 같이 실행이 잘되는 모습을 볼수 있다.

이건 땜시 고생좀 했다는 ㅋ
Posted by 샤키
Computer2009. 5. 26. 01:49

Base64는 기본적으로 64진수(2^6, 6비트)로 모든 정보를 표현하고자 하는데 있다.

그런데, 컴퓨터에서 한 문자는 8비트로 표현이 된다.

따라서, 6과 8로 나누어 떨어질 수 있는 최소공배수 24비트로 문자열을 처리단위가 결정 된다.

24비트란 크기는 Base64에서 다루게 될 6비트 기준으로는 4바이트가 되고,

흔히 컴퓨터에서 일컬어지는 문자의 단위인 8비트 기분으로는 3바이트가 된다.

따라서 Base64 인코딩은 다른 표현으로 3-to4 인코딩이라 하기도 한다


다시 대충 정리 하면

  • Base64 인코딩
    • MiMe에 주로 사용
    • Web인증 중 하나인 기본인증(Base Authentication)에도 사용됨
    • 2진 데이터를 ASCII 형태의 텍스트로 표현가능

 

  • Base64 구성
    • 64개의 문자로 구성됨
      • 알파벳 대문자 : 26자
      • 알파벳 소문자 : 26자
      • 숫자 : 10자
      • 특수문자 : + / 2자
    • 6Bit로 한 문자를 표현
    • =는 Padding 값으로 사용


그럼 문자열 KIM을 Base64 인코딩 해보자. 우선 KIM 문자열에 대한 2진수값을 구해야한다.
KIM의 HEX값은 4B(K)  49(I)  4D(M) 이므로, 이것을 다시 2진수로 변환하면
0100 1011 (K)   0100 1001 (I)   0100 1101 (D) 이 된다.

KIM(16) →     4B                   49                  4D
KIM(2) →  0100 1011         0100 1001        0100 1101


KIM의 2진수을 6비트 단위로 다시 잘라서 계산한다

KIM(2) →      0100 1011           0100 1001        0100 1101
KIM(6) →         010010             110100            100101           001101
KIM(6) →           18                    52                 37                  13
KIM(Base64)→    S                      0                  I                    N


아래 변환 테이블을 참고 하여 대입해보면 알수 있다 
즉, 18은 18번째의 ASCII값, 52번은 52번째...  이런 의미

10진수 ASCII 2진수 10진수 ASCII 2진수
0 A 000000 32 g 100000
1 B 000001 33 h 100001
2 C 000010 34 i 100010
3 D 000011 35 j 100011
4 E 000100 36 k 100100
5 F 000101 37 l 100101
6 G 000110 38 m 100110
7 H 000111 39 n 100111
8 I 001000 40 o 101000
9 J 001001 41 p 101001
10 K 001010 42 q 101010
11 L 001011 43 r 101011
12 M 001100 44 s 101100
13 N 001101 45 t 101101
14 O 001110 46 u 101110
15 P 001111 47 v 101111
16 Q 010000 48 w 110000
17 R 010001 49 x 110001
18 S 010010 50 y 110010
19 T 010011 51 z 110011
20 U 010100 52 0 110100
21 V 010101 53 1 110101
22 W 010110 54 2 110110
23 X 010111 55 3 110111
24 Y 011000 56 4 111000
25 Z 011001 57 5 111001
26 a 011010 58 6 111010
27 b 011011 59 7 111011
28 c 011100 60 8 111100
29 d 011101 61 9 111101
30 e 011110 62 + 111110
31 f 011111 63 / 111111







하지만 여기서 끝이 아니다.
모든 글자들이 딱딱 떨어지면 좋겠지만 그런것이 아니다 그래서 패딩을 이용하여 글자를 인코딩한다


예를 들어

딱 안떨어지는경우는 2경우가 있다.
먼저 처음으로

Hill을 16진수로 변환 하면 0x48, 0x69, 0x6C, 0x6C가 되고 다시 2진수로 바꾸어 보면

01001000   01101001   01101100   01101100   가 된다.  그럼 6비트씩 잘라보면

010010   000110   100101   101100   011011   00   24비트단위가 되야 하는데 32비트다.. 

그럼 48비트로 만들어야 하는데 16비트가 부족하다 마지막에 0으로 채워 넣어 보자

010010   000110   100101   101100   011011   00 0000   000000   000000  이 된다   10진수로 변환 해보면

18, 6, 37, 44, 27, 0, 0(패딩), 0(패딩) 이 된다  

굶은0은 실제로 있던값이고 뒤에 0은 48비트를 만들기위해 붙여진거라 서로 틀린것이다

그래서 패딩(0)으로 채워진 영역은 " = "으로 쓰는것이다.

S, G, I, s, b, A, =, = 

즉, Hill은 Base64로 인코딩하면 SGIsbA== 가 된다


2번째로

Choiw을 16진수로 변환 하면 0x43, 0x68,  0x6F, 0x69, 0x77이 된다   2진수로 바꾸면

01000011  01101000  01101111  01101001  01110111   되고   6비트씩 자르면

010000   110110   100001   101111   011010   010111   0111 

24비트단위가 되어야 하는데 40비트 그럼 48비트로 하려면 8비트가 부족하다 이것역시 마지막에 0을 채운다

010000   110110   100001   101111   011010   010111   011100   000000 이 된다  10진수로 변환 하면

16, 54, 33, 47, 26, 23, 28, 0(패딩) 이 된다   역시 패딩영역만 " = " 하면

Q, 2, h, v, a, X, c, = 

즉, Choiw을 Base64로 인코딩하면 Q2hvaXc= 가 된다

그래서 정리해보면 패딩(=)은 문자들이 딱떨어지면 없는경우와 하나인경우, 두개인경우가 존재 한다.




개인적으로 공부 하려고 글 정리 하다가 엄청 길어졌다 +_+

이런식으로 이론을 어느정도 알고 나중에 급하게 사용할때는

http://oxtag.com/php/p/base64-converter.php

http://home2.paulschou.net/tools/xlate/

이런 변환사이트나 툴을 이용하면 딱!!   위에 가서 내가 인코딩한게 맞는지 테스트 해보는것도!!



Posted by 샤키
유머2009. 5. 22. 00:37

 


태연이가 계속 날 쳐다보네 ㅋ
Posted by 샤키