♦ 조건문의 형식

 조건문은 []로 묶어지며 [ -f /etc/passwd ] 조건식을 주었을 때 [ -f 조건식은 공백을 꼭 띄워 주며, 조건의 끝임을 알리는 ;을 입력하며, 만일 then 문장을 입력할 때는 ; 을 생략해도 >된다

if [ 조건 ]; then

             문장

elif [ 조건 ]; then

             문장

else

             문장

fi

if command; then

             문장

elif command; then

             문장

else

             문장

fi

 

test 명령어 연산자

test 명령어는 뒤에 오는 조건식을 검사하여 참, 거짓 여부를 판단 할 수 있다.

)         test expressions

             [ expressions ]

 

산술 비교 연산자

제어문

설명

val1 –eq val2

equal, 변수 val1과 변수 val2 같은 경우 true

val1 –ne val2

negative, 변수 val1과 변수 val2 다른 경우 true

val1 –gt val2

greater then, 변수 val1이 변수 val2 보다 큰 경우 true

val1 –lt val2

less then, 변수 val1이 변수 val2 보다 작은 경우 true

val1 –ge val2

greater or equal, 변수 val1이 변수 val2 보다 크거나 같은 경우 true

val1 – le val2

less or equal, 변수 val1이 변수 val2 보다 작거나 가은 경우 true

 

파일 검사 연산자

제어문

설명

-a

파일이 존재한 경우 true

-b

파일이 존재하고 블록장치 파일인 경우 true

-c

파일이 존재하고 캐릭터 장치 파일인 경우 true

-d

파일이 존재하고 디렉토리인 경우 true

-e

파일이 존재하고 파일이 있는 경우 true

-f

파일이 존재하고 정규 파일인 경우 true

-g

파일이 존재하고 SetGID가 설정된 경우 true

-h

파일이 존재하고 한 개 이상의 심볼릭 링크가 설정된 경우 true

-k

파일이 존재하고 Sticky bit가 설정된 경우 true

-p

파일이 존재하고 FIFO인 경우 true

-r

파일이 존재하고 읽기 가능한 경우 true

-s

파일이 존재하고 0보다 큰 경우 true

-u

파일이 존재하고 SetUID가 설정된 경우 true

-w

파일이 존재하고 쓰기가 가능한 경우 true

-x

파일이 존재하고 실행 가능한 경우 true

 

문자열 비교 연산자

제어문

설명

-z string

문자열의 길이가 0인 경우 true

-n string

문자열의 길이가 0이 아닌 경우 true

string1 = string2

문자열 string1string2가 일치하는 경우

string1 != string2

문자열 string1string2가 일치하지 않는 경우

string

문자열이 NULL이 아닌 경우

 

예제

#!/bin/bash

# $# 입력 받은 매개 변수의 개수를 의미

if [ $# -lt 1 ]; then

             echo “$0 <Account>…”

             exit 0

fi

 

# 명령의 결과를 저장하기 위해 `( back quarter)를 사용했다.

# ‘(single quarter)과 혼동 할 수 있으므로 주의 하도록 한다.

ret=`grep –w “^$1” /etc/passwd`

 

if test –n “$ret” ; then

             echo $ret

else

             echo “User not found”

fi

 

원문 : Linux system & Shell programming(영진 닷 컴)

Posted by kukuta

댓글을 달아 주세요

  1. 444 2013.10.28 18:49  댓글주소  수정/삭제  댓글쓰기

    산술 비교 연산자 qt...

  2. 444 2013.10.28 18:49  댓글주소  수정/삭제  댓글쓰기

    산술 비교 연산자 qt...

  3. 좋은 자료 감사합니다 2016.04.29 11:31  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사합니다

  4. guest 2016.05.11 16:08  댓글주소  수정/삭제  댓글쓰기

    자료 감사합니다.

  5. SJ 2019.10.15 14:14  댓글주소  수정/삭제  댓글쓰기

    감사합니다 힘내세요^^

구버젼의 UNIX 시스템에서는 레코드 단위(혹은 byte range 단위)에 대한 loking을 지원 하지 않았다. 하지만 여러가지 상업적인 이유와 역사적인 이유로 인해서 각 UNIX 계열 시스템에서도 레코드 단위의 locking을 지원하기 시작 했다고 한다.

#include <fcntl.h>

int fcntl(int filedes, int cmd, .../* struct flock *flockptr */);

 record locking을 위해서 사용되는 cmd의 인자로는 F_GETLK, F_SETLK 또는 F_SETLKW가 올수 있다. 세번째 인자인 flockptr은 flock 구조체의 포인터다. 인자의 설명은 이름을 통해 직관적으로 알 수 있으니 건너 뛰기로 하고 F_GETLK에 대해서만 간단히 알아 보자.

F_GETLK : 다른 lock이 걸려 있는지 알아 보는 플래그

struct flock {
                    short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */
                    off_t l_start; /* offset in bytes, relative to l_whence */
                    short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */
                    off_t l_len; /* length, in bytes; 0 means lock to EOF */
                    pid_t l_pid; /* returned with F_GETLK */
 };

l_type : F_RDLCK(shared read lock), F_WRLCK(exclusive write lock), F_UNLCK(unlock)
l_start : lock 또는 unlock 될 영역의 시작 오프셋
l_whence : SEEK_SET, SEEK_CUR, SEEK_END
l_len : l_start부터 lock을 걸 바이트, 0은 EOF까지를 의미한다.
l_pid : F_GETLK일때만 리턴, lock을 가지고 있는 프로세스의 아이디


참고적으로 read lock은 한개 이상의 read locking 요청을 받아 들일 수 있지만, write locking 한 개만 이상 받아 들이지 않는다.

'진리는어디에' 카테고리의 다른 글

서브(Sub) 쿼리  (4) 2009.02.26
조인(Join) 쿼리  (0) 2009.02.23
fcntl() 함수를 이용한 File locking  (0) 2009.02.22
MySQL - Commmands out of sync  (0) 2009.02.17
구조체 비트 단위 멤버  (1) 2009.02.14
XPath - attribute 값으로 특정 엘리먼트 찾기  (6) 2009.02.02
Posted by kukuta

댓글을 달아 주세요

stty -a or all : 현재 사용중인 터미널의 메타문자들을 보여 줌
ctrl+h : 한 문자를 지움, backspace와 동일
ctrl+u : 커서 앞의 문자를 모두 지움
ctrl+w : 커서 앞의 한 단어를 지움


'도구의발견' 카테고리의 다른 글

msxml 파서 사용하기  (2) 2008.04.03
Dependency Walker 2.2  (0) 2008.03.21
Shell 프롬프트에서의 단축키  (0) 2008.03.11
putty 한글 사용하기  (0) 2008.02.20
CppUnit Cookbook  (0) 2008.01.28
PHP - 쉘 스크립트로 활용 하기  (5) 2007.11.03
Posted by kukuta

댓글을 달아 주세요

1. Shell?

  shell이란 kernel 프로그램 사용자 인터페이스를 제공하는 중간 매개체이다.

  사용자가 shell에서 제공하는 프롬프트를 이용하여 명령어를 입력하면 shell 입력 받은 명령어를 kernel 실행 있는 언어로 변환하여 전달 실행되기 때문에 보통 shell 명령어 해석기라고 한다.

 

2. Shell 변경 확인


2.1. 사용 가능한 Shell 확인

  # chsh –l or 또는 cat /etc/shells 입력하면 사용 가능한 shell 출력된다.


2.2. Shell 변경

  다른 쉘로 변경하기 위해서는 프롬프트 상에서 “chsh” 입력하면 새로운 프롬프트를 생성한다. 이때 바꾸고자 하는 쉘이 있는 패스를 적어주면 된다. 이렇게 쉘을 변경하게 되면 /etc/passwd 파일 내에서도 기존의 쉘이 새로 지정한 쉘로 변경된다. 또한 “chsh –s /bin/csh” 실행하면 현재 로그인한 쉘을 변경하게 된다.


3. Shell 명령어


명령어

설명

:

항상 명령어의 실행 값은 참을 반환하며 아무런 액션도 발생하지 않는다. 참값을 반환하기 때문에 “while : ; do” 같은 형태로 루프문에서 무한 루프를 설정하고 사용된다.

.

지정한 파일로부터 읽거나 실행

alias

명령에대한 앨리어스 지정

bg

특정한 프로세스를 백그라운드로 진행

bind

readline에서의 또는 함수, 매크로에 순서를 결합하고자 사용

break

루프문에서 루프문을 탈출하고자 사용

builtin

내부 명령어나 함수를 실행할 사용할 있으며 스크립트에서 외부명령어와 내부명령어가 같은 이름으로 존재할 내부 명령어만을 실행한다. 만일 지정한 내부 명령어나 함수가 존재하지 않는다면 에러를 출력한다.

cd

디렉토리 이동 명령어

command

내부 명령어 외부 명령어를 실행하며 세부적인 정보를 출력할 있는 명령어

continue

루프문에서 루프문의 처음으로 되돌아 사용하는 명령어

declare

변수를 선언하거나 속성을 부여하고자 사용하는 명령어

dirs

현재 저장되어 있는 디렉토리 리스트 목록 출력

disown

쉘에서 활성화 되어 있는 작업 테이블에서 특정한 작업 목록을 삭제

echo

입력된 문자열의 출력

enable

내부 명령어의 활성화 비활성화

eval

설정되어 있는 인자를 명령어로 변환

exec

현재 프로세스를 치환

exit

종료

export

지정한 환경변수를 하위 프로세스까지 전달

fc

히스토리 편집 출력

fg

포그라운드에서 실행

getopts

명령어의 옵션을 분리하는 명령어

hash

입력한 명령어에 대한 경로를 해쉬 테이블에 저장하여 명령어를 다시 호출할 시스템 패스 $PATH에서 검색하지 않고 해쉬 테이블에서 검색

help

내부 명령어 도움말 출력

history

이전에 사용한 명령어의 출력

jobs

실행중인 작업 목록을 출력

kill

현재 실행중인 프로세스 중단

let

산술 논리 계산

local

로컬 변수의 선언 호출

logout

로그 아웃

popd

저장된 디렉토리 스택으로 부터제거

printf

정형화된 데이터의 출력

pushd

디렉토리 스택으로 저장

pwd

현재 디렉토리 출력

read

프롬프트로부터 데이터 입력

readonly

프롬프트로부터 읽기 전용의 데이터 입력

return

호출한 부모 프로세스로 반환 되는

set

변수 설정

shift

위치 매개 변수의 이동

shopt

옵션의 출력 설정

source

지정한 파일로부터 읽거나 실행

suspend

특정한 신호를 받을 까지 일시 중지

test

조건식을 평가

times

프로세스가 사용한 시간을 출력

trap

명령어 실행 도중 특정한 신호가 입력되었을 때의 처리

type

지정한 명령어가 내부 명령어인지 외부 명령어인지를 출력

typeset

declare 같은 의미

ulimit

시스템 자원을 제한

unmask

파일 디렉토리에 대한 생성 마스크 설정

unalias

앨리어스 해제

unset

함수 변수의 초기화

wait

하위 프로세스가 종료 까지 대기


3.1. 기본적인 입력 명령어


3.1.1. 문자 출력 echo

-n

마지막 문자 “\n” 출력 하지 않는다

-e

\(역슬래쉬) 문자 번역

3.1.2. 정형화된 문자 출력 printf

C에서 제공하는 printf 비슷한 기능을 제공

사용법 : printf format [argument]

#!/bin/bash

com=”computer”

printf “$com\n” à computer

printf “%s” $com à computer

printf “%s\t” com à com

printf “%s\n” “computer” à computer

printf “%s\n” “$com” à computer

 

3.2. 기본적인 출력 명령어


3.2.1. 사용자로부터 값을 입력 받는 read

사용법 : read [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] 변수명

-t

사용자로부터 입력 받을 시간을 설정하여 입력한 시간을 초과하면 자동으로 넘어간다.

-p

입력 프롬프트의 형태를 지정하며 문자열을 이용하여 출력

-a

입력 받은 변수가 배열임을 정의

-n

입력 받을 값의 크기 설정(문자의 개수)

-d

지정한 문자열을 입력 때까지 입력 받음

-r

입력한 이스케이프 문자를 인식

-s

사용자로부터 입력 받은 문자를 프롬프트에 echo 하지 않기 때문에 주로 패스워드 입력에 이용. 같은 명령어로 “sty –echo” 프롬프트 echo 기능을 정지 하며 “sty echo” 프롬프트 기능을 활성화 한다.

ex) #read –p “Input name : “ –t 10 –n 5 read_value

 

주의 : 변수를 대입 변수 = 같은 형태로 사이에 스페이스를 넣게 되면 대입연산이 아니라 비교 연산이 된다.

4. 기본적인 스크립트

4.1 스크립트의 실행

 만들어진 쉘을 실행하는데 sh 명령어를 이용하거나 또는 스크립트 파일의 실행권한을 활성화 하여 일반 실행 파일처럼 사용하면 된다.

 

4.2. 스크립트의 구분 인자

  스크립트는 명령어와 명령어의 옵션 매개변수로 구분되며 명령어와 명령어의 구분인자로는 Enter 또는 ; 이며 명령어의 옵션 매개변수는 tab 또는 하나 이상의 space 구분 있다.

 

4.2.1 IFS인자 구분 매개 변수

 IFS 구분 인자를 저장하고 있는 변수로, 기본적으로 “space, tab, newline”이다. 만일 특정 문자를 구분인자로 설정하기 위해서 IFS 값을 다른 값으로 지정하여 사용 있다.

 

잘 못된 내용이나 의문사항은 kukuta@gmail.com으로 메일 주세요

 

Posted by kukuta

댓글을 달아 주세요

  1. 정광철 2011.04.29 09:48  댓글주소  수정/삭제  댓글쓰기

    퍼갈께요 좋은정보 감사합니다다

  2. rkfosk 2013.02.13 12:13  댓글주소  수정/삭제  댓글쓰기

    쉘 스크립트에 대해 아는게 없는지라 공부중인데 어렵지만 재밌네요 ㅋㅋ 감사합니다 잘보고 가요.

Unix Linux에서는 OS 의해 사용되는 기본적인 변수(시스템 변수) 사용자 정의 변수 나뉠 있다.

일반적으로 시스템 변수는 대문자로, 사용자 변수는 소문자로 표기한다.

1. 시스템 변수

PS1

bash 프롬프트

PS2

쉘의 하위 프롬프트 설정

PS3

select 문에서의 프롬프트

PS4

bash debug 모드에서의 프롬프트

HOME

사용자 홈디렉토리

PATH

실행 파일의 디렉토리 경로 지정

BASH

사용 경로

BASH_VERSION

bash 쉘의 버전

ENV

환경 설정 파일

USER

사용자

USERNAME

사용자 이름

SHELL

지정한 쉘의 경로

MAIL

메일 보관 디렉토리 경로

MAILCHECK

메일 확인 주기

MAILPATH

사용자 메일 경로 설정 변수

UID

사용자 UID

GID

사용자 GID

LOGNAME

현재 로그인한 사용자

LINES

터미널의 출력 라인

HOSTNAME

호스트 이름

HOSTTYPE

현재 시스템의 CPU 타입

HISTFILESIZE

히스토리 파일 크기

HISTSIZE

히스토리 사용 개수

OSTYPE

운영체제의 타입

PWD

현재 디렉토리의 절대 경로

TERM

현재 사용 중인 터미널의 종류

COLUMNS

현재 사용 중인 터미널의 크기(기본 80컬럼)

LS_COLORS

파일 출력 명령어 사용시 파일의 종류에 따라 컬러 사용

IFS

인자 분리 매개 변수

CDPATH

디렉토리 패스 설정변수

SECONDS

bash 시작하여 경과된 시간

EUID

현재 로그인한 사용자의 UID

RANDOM

임의의 정수를 생성하는 변수

IGNOREEOF

입력행에서 EOF문자가 입력되었을 쉘의 종료를 제어

TMOUT

지정한 시간에 프롬프트의 입력이 없다면 로그 아웃

외에도 많은 환경 변수들이 존재한다. 이는 env 명령어를 통해 확인 있다.

2.
특별 내장 변수

$$

현재 실행중인 프로세스의 PID

$?

마지막에 실행한 명령어의 종료값을 반환하며 실행한 명령어의 에러 정상 실행을 파악하기 위해 사용

$!

마지막 자식 프로세스의 PID

$#

프롬프트 상에서 실행한 명령어나 함수에 의해 전달된 매개변수에 전달 인자의 개수

#0

명령어 실행 명령어를 저장하는 변수로 위치 매개변수라고

$1,$2…

명령어에 전달된 전달 인수가 공백을 기준으로 각각 저장하며 위치 매개 변수라고

$*

명령어에 전달된 전달 인수 전체를 하나의 문자열로 표시하며 전체가 따옴표로 처리

$@

전달 인수를 문자열의 목록으로 표시하며 인자에 따옴표로 처리

$_

프롬프트나 쉘에서 마지막에 전달된 명령어나 명령어에 전달된 인수 값을 저장하며 쉘명령어에 의해 설정 플래그


3. 일반 변수
사용자 정의 변수에 대해서는 크게 설명 할 것이 없다. 선언 하거나 대입 연산을 할 때는 변수의 이름만을 사용하고, 변수의 값을 참조 할 때는 변수 앞에 $를 붙여 준다. 또한 변수선언을 할때 공백문자가 들어가면 안된다.

#!/bin/bash
my_name="kukuta"  # my_name = "kukuta" (X)
echo $my_name

 

Posted by kukuta

댓글을 달아 주세요

1. for

for 의 형식

 for 문은 in 다음에 오는 값을 끝까지 대입하여 반복적으로 실행하는 실행 문이다.

for 변수 in ; do

문장

done

for ((초기값;조건식;증감)); do

   문장

done

 

예제 for_ls.sh

#!/bin/bash

for i in $(ls); do

    echo FILE : $i

done

 

예제 for_inc.sh

#!/bin/bash

for ((i=0;i<10;i++)); do

    echo $i

done

 

 

Posted by kukuta

댓글을 달아 주세요

  1. 김일태 2013.03.15 19:33  댓글주소  수정/삭제  댓글쓰기

    오 구글에서 찾았는데 이게 나왔어 ㅋㅋ

  2. 박상국 2015.05.29 13:26  댓글주소  수정/삭제  댓글쓰기

    나도 ㅋㅋㅋ

  3. 김숭어 2015.09.01 22:24  댓글주소  수정/삭제  댓글쓰기

    이글은 1년에 몇번씩은 꼭 찾네 ; 에궁

  4. aaa 2016.08.11 11:03  댓글주소  수정/삭제  댓글쓰기

    aaaaa

 대학교나 기타 공공 기관에서 몰래 서버를 한대 설치하고 서비스를 하다 보면 꼭 방화벽이라는 놈들이 포트를 막아 해당 서비스를 하지 못하도록 막는다. 이럴 경우에는 서비스 포트를 변경해 주면 되는데, 보통 웹서비스를 하는 80포트는 잘 안막으므로 자주 애용해 주도록 하자.

 이런 저런 설명들을 장황히 늘어 놓는 것 보다도 telnet서비스의 포트를 변경하는 법과 포트를 하나 더 띄우는 방법을 설명 하도록 하겠다. 나머지는 알아서 응용하도록...

[텔넷 서비스 포트 변경]

1.서비스 포트 변경은 /etc/services 파일에 있는 텔넷 서비스 포트를 다른 숫자로 변경하면 된다. 텔넷의 경우 기본 포트는 23번을 사용하지만 예를 들어 203으로 지정하면, 원격 접속시 203 포트를 지정하지 않으면 텔넷 접속이 불가능해진다. 포트 변경 할 경우, 혹시나 다른 서비스에서 그 포트를 사용하는지 확인해 보는것도 잊지 말아야 한다.

/etc/services 파일에서 telnet 포트를 다음과 같이 203으로 변경한다.

telnet          203/tcp
telnet          203/udp # 솔찍히 udp는 하나마나다..

 원격지의 서버에서 telnet을 203포트로 접속한다.

2.하나의 서비스에 기본 포트 이외의 포트를 추가 할 경우가 있다. 이 경우 /etc/services 파일을 수정 하는 것 뿐만 아니라, /etc/xinet.d에 있는 서비스 파일을 하나 더 복사해야 한다.

telnet2        2003/tcp
telnet2        2003/upd

cp /etc/xinet.d/telnet /etc/xinet.d/telnet2

 복사한 telnet2 파일을 열어 아래와 같이 수정 하자.

service telnet2
{
    flags = REUSE
    socket_type = stream
    wait = no
    user = root
    server = /usr/sbin/in.telnetd
    log_on_failure += USERID
    disable =no // ==>를 yes가 아닌 no로 수정
}

이렇게 수정을 한 다음, 터미널에서 다음과 같이 입력한다.
/etc/rc.d/init.d/xinetd restart

이렇게 하면 inet데몬이 대기하다 요청이 들어오면 telnet 프로세스를 띄워준다.

'도구의발견' 카테고리의 다른 글

PHP - 쉘 스크립트로 활용 하기  (5) 2007.11.03
vim 문자열 검색 및 치환  (2) 2007.10.25
서비스 포트 변경  (0) 2007.05.09
gcc 라이브러리 만들기와 사용  (0) 2007.04.24
gcc의 실행과 옵션  (0) 2007.04.24
cvs 사용법  (0) 2007.03.03
Posted by kukuta

댓글을 달아 주세요