본문 바로가기

Learning/└◆Shell Scripts

[Shell Scripting] 본(Born) 쉘 프로그래밍_4

 

 

10

옵션처리

 

) --> 

) --> 

) --> 

) --> 

getopts CMD

-------------

) --> 

NAME

getopts - parse utility options

) --> 

SYNOPSIS

/usr/bin/getopts optstring name [ arg...]

) --> 

sh

getopts optstring name [argument...]

) --> 

ksh

getopts optstring name [arg...]

) --> 

DESCRIPTION

/usr/bin/getopts

The getopts utility can be used to retrieve options and

option-arguments from a list of parameters.

) --> 

Each time it is invoked, the getopts utility places the

value of the next option in the shell variable specified by

the name operand and the index of the next argument to be

processed in the shell variable OPTIND. Whenever the shell

is invoked, OPTIND is initialized to 1.

) --> 

When the option requires an option-argument, the getopts

utility places it in the shell variable OPTARG. If no option

was found, or if the option that was found does not have an

option-argument, OPTARG is unset.

) --> 

If an option character not contained in the optstring

operand is found where an option character is expected, the

shell variable specified by name is set to the question-mark

( ? ) character. In this case, if the first character in

optstring is a colon (:, the shell variable OPTARG is set to

the option character found, but no output is written to

standard error; otherwise, the shell variable OPTARG is

unset and a diagnostic message is written to standard error.

This condition is considered to be an error detected in the

way arguments were presented to the invoking application,

but is not an error in getopts processing.

) --> 

If an option-argument is missing:

) --> 

o If the first character of optstring is a colon, the

shell variable specified by name is set to the colon

character and the shell variable OPTARG is set to the

option character found.

) --> 

o Otherwise, the shell variable specified by name is set

to the question-mark character (?), the shell variable

OPTARG is unset, and a diagnostic message is written to

standard error. This condition is considered to be an

error detected in the way arguments were presented to

) --> 

the invoking application, but is not an error in

getopts processing; a diagnostic message is written as

stated, but the exit status is zero.

) --> 

When the end of options is encountered, the getopts utility

exits with a return value greater than zero; the shell vari-

able OPTIND is set to the index of the first non-option-

argument, where the first -- argument is considered to be an

option-argument if there are no other non-option-arguments

appearing before it, or the value $# + 1 if there are no

non-option-arguments; the name variable is set to the

question-mark character. Any of the following identifies the

end of options: the special option --, finding an argument

that does not begin with a -, or encountering an error.

) --> 

The shell variables OPTIND and OPTARG are local to the

caller of getopts and are not exported by default.

) --> 

The shell variable specified by the name operand, OPTIND and

OPTARG affect the current shell execution environment.

) --> 

If the application sets OPTIND to the value 1, a new set of

parameters can be used: either the current positional param-

eters or new arg values. Any other attempt to invoke getopts

multiple times in a single shell execution environment with

parameters (positional parameters or arg operands) that are

not the same in all invocations, or with an OPTIND value

modified to be a value other than 1, produces unspecified

results.

) --> 

USAGE

Since getopts affects the current shell execution environ-

ment, it is generally provided as a shell regular built-in.

If it is called in a subshell or separate utility execution

environment, such as one of the following:

) --> 

(getopts abc value "$@")

nohup getopts ...

find . -exec getopts ... \;

) --> 

it does not affect the shell variables in the caller's

environment.

) --> 

Notice that shell functions share OPTIND with the calling

shell even though the positional parameters are changed.

) --> 

Functions that want to use getopts to parse their arguments

usually want to save the value of OPTIND on entry and

restore it before returning. However, there are cases when a

function wants to change OPTIND for the calling shell.

) --> 

EXAMPLES

Example 1: Parsing and Displaying Arguments

) --> 

The following example script parses and displays its argu-

ments:

) --> 

aflag=

bflag=

while getopts ab: name

do

case $name in

a) aflag=1;;

b) bflag=1

bval="$OPTARG";;

?) printf "Usage: %s: [-a] [-b value] args\n" $0

exit 2;;

esac

done

if [ ! -z "$aflag" ]; then

printf "Option -a specified\n"

fi

if [ ! -z "$bflag" ]; then

printf 'Option -b "%s" specified\n' "$bval"

fi

shift $(($OPTIND - 1))

printf "Remaining arguments are: %s\n" "$*"

) --> 

Example 2: Processing Arguments for a Command with Options

) --> 

The following fragment of a shell program processes the

arguments for a command that can take the options -a or -b.

It also processes the option -o, which requires an option-

argument:

) --> 

while getopts abo: c

do

case $c in

a | b) FLAG=$c;;

o) OARG=$OPTARG;;

\?) echo $USAGE

exit 2;;

esac

done

shift `expr $OPTIND - 1`

) --> 

Example 3: Equivalent Code Expressions

) --> 

This code example accepts any of the following as

equivalent:

) --> 

cmd -a -b -o "xxx z yy" filename

cmd -a -b -o "xxx z yy" -- filename

cmd -ab -o xxx,z,yy filename

cmd -ab -o "xxx z yy" filename

cmd -o xxx,z,yy -b -a filename

) --> 

ENVIRONMENT VARIABLES

See environ(5) for descriptions of the following environment

variables that affect the execution of getopts: LANG,

LC_ALL, LC_CTYPE, LC_MESSAGES, and NLSPATH.

) --> 

OPTIND This variable is used by getopts as the

index of the next argument to be processed.

) --> 

OPTARG This variable is used by getopts to store

the argument if an option is using argu-

ments.

) --> 

) --> 

getopts 를 이용한 명령행 옵션 처리

) --> 

다수의 명령행 옵션이 필요한 스크립트를 작성하고자 한다면 위치 인자의 사용이 가장 효율적인 방법은 아니다. 예를 들어 ls 명령어에는 수 많은 옵션과 인자를 사용할 수 있다. 옵션을 전달한는데는 다양한 방법이 있을 수 있다. ls -alF, ls -a -l -F, ls -al -F 등이 모두 같은 의미이다. 인자가 필요한 스크립트에서는 위치 인자를 이요하여 각각 처리해야 한다. 예를 들면, ls -l -i -F 식으로 표현해야 한다. 각 옵션들은 $1, $2, $3에 저장될 것이다. 하지만 사용자가 하나의 - 기호 아래에 전체 옵션을 붙여서 써버리면 어쩌겠는가. 이 경우 전체 옵션이 $1에 모두 저장되어 버린다. getopts 함수는 ls 명령어처럼 옵션과 인자를 사용할 수 있도록 해준다.

) --> 

getopts 함수를 사용하면 아래와 같은 다양한 형태의 옵션과 인자를 처리할수 있다.

# script -x -n 200 filename

# script -xn 200 filename

# script -xy

# script -yx -n 30

# script -n 250 -xy filename

) --> 

) --> 

getopts 함수가 어떤게 인자를 처리하는지 살펴보자.

while getopts :xyn: name

) --> 

x, y, n은 옵션들이다.

명령행에서 입력한 옵션은 '+''-'로 시작한다.

'-''+'를 갖지 않는 옵션이 오면 getopts로 하여금 옵션 목록이 끝났음을 알려준다.

옵션 다음에 콜론(:)을 붙이면, 이 옵션에는 인자가 필요함을 의미한다. , -n 옵션에는 인자가 함께 주어져야 한다.

옵션 앞에 콜론(:)을 붙이면, 유효하지 않은 옵션이 입력되었을지라도, 개발자가 이것을 처리하도록 허용함을 의미한다. 예를 들어 script.sh -p 라고 사용했을 때, -p 옵션은 유효한 옵션이 아니다. getopts는 이 사실을 개발자에게 알려주기는 하지만, 쉘은 따로 에러 메세지를 출력시키지는 않는다.

getopts가 호출되면 다음 옵션을 ‘-’가 없는 상태로 변수 name에 저장한다(변수 이름은 상관이 없다). 옵션 앞에 ‘+’가 붙으면, ‘+’기호와 함께 옵션을 name 변수에 저장한다. 적절하지 않은 인자가 주어지면 name에는 ? 기호를 저장한다. 만약 필요한 인자가 지정되지 않으면 name 변수에 콜론(:)을 저장한다.

특수 변수 OPTIND1로 초기화한 후, getopts가 하나의 명령행 인자를 성공적으로 처리할 때마다 1씩 증가한다.

OPTARG 변수는 유효한 인자의 값을 가진다. 유효하지 않은 옵션이 주어지면 그 옵션이 OPTARG에 저장된다.

) --> 

) --> 

) --> 

) --> 

[예제1] getopts 옵션 처리 예제

) --> 

옵션이 b로 지정되는 경우 b는 유효하지 않는 옵션이다.

getopts는 표준 에러로 메시지를 출력한다.

그리고 대시(-)가 먼저 오지 않으면 옵션으로 간주하지 않는다.

getopts는 인자들의 처리를 중단한다.

) --> 

) --> 

# cat getopts1.sh

 

#!/bin/ksh

) --> 

while getopts xy options

do

case $options in

x) echo "Your Entered : X" ;;

y) echo "Your Entered : Y" ;;

*) echo "Usage: $0 Option(s)"

exit 1 ;;

esac

done

 

) --> 

# chmod +x getopts1.sh

# ./getopts1.sh -x

 

Your Entered : X

 

) --> 

# ./getopts1.sh -xy (# ./getopts1.sh -x -y)

 

Your Entered : X

Your Entered : Y

 

) --> 

# ./getopts1.sh -y

 

Your Entered : Y

 

) --> 

# ./getopts1.sh -b

 

getopts1.sh[3]: getopts: b bad option(s)

Usage: getopts1.sh Option(s)

 

) --> 

# ./getopts1.sh b

#

-> 대시(-)가 먼저 오지 않으면 옵션으로 간주하지 않는다. getopts는 인자들의 처리를 중단한다.

) --> 

[예제2] getopts 옵션 처리 예제2

) --> 

에러처리를 프로그래머가 처리할 수 있도록 설정하였다.

) --> 

# cat getopts2.sh

 

#!/bin/ksh

) --> 

while getopts xy options 2>/dev/null

do

case $options in

x) echo "Your Entered : X" ;;

y) echo "Your Entered : Y" ;;

*) echo "Usage: $0 Option(s)"

exit 1 ;;

esac

done

 

) --> 

# getopts2.sh -x

 

Your Entered : X

 

) --> 

# getopts2.sh -y

 

Your Entered : Y

 

) --> 

# getopts2.sh xy

) --> 

# getopts2.sh -xy

 

Your Entered : X

Your Entered : Y

 

) --> 

# getopts2.sh -q

 

Usage: getopts2.sh Option(s)

 

-> -g는 유효한 옵션이 아니다. 따라서 ? 기호가 변수 options에 저장된다. 그리고 OPTARG 변수에는

유효하지 않은 옵션인 q가 지정된다.

) --> 

# getopts2.sh -c

 

Usage: getopts2.sh Option(s)

 

-> -c는 유효한 옵션이 아니다. 따라서 ? 기호가 변수 options에 저장된다. 그리고 OPTARG 변수에는

유효하지 않은 옵션인 c가 지정된다.

) --> 

) --> 

[예제3] getopts 옵션/인자 처리 예제

) --> 

옵션 e는 유효하지 않은 옵션이다. 따라서 ? 기호가 변수 options에 저장된다.

-+기호가 없이 옵션을 지정하면, getopts는 옵션으로 인식하지 않고 0이 아닌 종료 상태값을 되돌린다. while 루프가 종료된다.

) --> 

) --> 

# cat getopts3.sh

 

#!/bin/ksh

) --> 

while getopts dq: options 2>/dev/null

do

case $options in

d) echo "-d is a valid switch" ;;

q) echo "The argument for -q is $OPTARG" ;;

\?) echo "Usage: $0 -dq filename" 1>&2 ;;

esac

done

 

) --> 

# ./getopts3.sh -d

 

-d is a valid switch

 

) --> 

# ./getopts3.sh -q foo (# ./getopts3.sh -d -q foo)

 

The argument for -q is foo

 

) --> 

# ./getopts3.sh -q

 

Usage: getopts3.sh -dq filename

 

) --> 

# ./getopts3.sh -e

 

Usage: getopts3.sh -dq filename

 

) --> 

# ./getopts3.sh e

#

) --> 

) --> 

[예제4] getopts 옵션/인자 처리 예제

# cat getopts4.sh

 

#!/bin/ksh

) --> 

while getopts xyz: arguments 2>/dev/null

do

case $arguments in

x) echo "Your Entered : X" ;;

y) echo "Your Entered : Y" ;;

z) echo "Your Entered : Z"

echo "\$OPTARG is $OPTARG." ;;

\?)echo "Usage: $0 [-xy] [-z argumennt]"

exit 1 ;;

esac

done

 

) --> 

# chmod +x getopts4.sh

# ./getopts4.sh -xyz foo

 

Your Entered : X

Your Entered : Y

Your Entered : Z

$OPTARG is foo.

 

) --> 

# ./getopts4.sh -x -y -z foo

 

Your Entered : X

Your Entered : Y

Your Entered : z

$OPTARG is foo.

 

) --> 

# ./getopts4.sh -d

 

Usage: ./getopts4.sh [-xy] [-z argumennt]

 

) --> 

) --> 

) --> 

 

[참고] 옵션을 처리하는 다른 방법

) --> 

# cat args.sh

 

#!/bin/ksh

) --> 

if [ $# -eq 0 ] ; then

echo Default Excution

exit 0

fi

) --> 

for parameter in $*

do

     ARG1=`echo $parameter | awk '{print $1}'`

     case $ARG1 in

          -a) echo ALL OPTION ;;

          -r) echo REVERSE SORTING ;;

          -t) echo TIME SORTING ;;

          *) echo "Usage : $0 [-a] [-r] [-t]"

          echo "Example: $0 -a"

          exit 1

     esac

     shift    <= 인자를 왼쪽으로 shift해서 하나씩 처리하고 전부 처리한다.

done

 

) --> 

# chmod +x args.sh

# ./args.sh -a

 

ALL OPTION

 

) --> 

# ./args.sh -a -t

 

ALL OPTION

TIME SORTING

 

) --> 

# ./args.sh -l

 

Usage : ./args.sh [-a] [-r] [-t]

Example: ./args.sh -a

 

) --> 

# ./args.sh

 

Default Excution

 

) --> 

(결론) 옵션 처리에 대해서는 많은 방법이 존재할 수 있지만 getopts 명령어를 통해 처리하는 것이 가장 많은 기능을 제공하기도 하고, 간단한 처리도 가능하다.

 

) --> 

) --> 

) --> 

) --> 

) --> 

) --> 

) --> 

) --> 

) --> 

) --> 

) --> 

 

11

쉘 내장 명령어

 

) --> 

) --> 

) --> 

쉘 내부에는 여러 가지 명령어들이 정의 되어 있다. 내장 명령어들은 디스크에서 찾을 필요가 없어서 빠르게 수행된다. 다음은 sh 쉘 내장 명령어들이다.

) --> 

 

옵 션

설 명

:

아무 것도 수행하지 않고, 종료 상태만 0으로 반환한다.

. file

마침표(.) 명령어는 파일을 읽어서 실행시킨다.

break [n]

루프의 내용을 참고하라.

continue [n]

루프의 내용을 참고하라.

cd

디렉토리 변경

echo [args]

인자를 에코한다.

eval command

실행전에 명령행의 내용을 두 번 검사하게 된다.

exec command

현재 쉘에서 명령어를 실행한다.

exit [n]

종료 상태를 n으로 반환하고 종료한다.

export [var]

자식 쉘에게 var을 상속한다.

hash

명령어의 빠른 수행을 위해 내부 해시 테이블을 제어한다.

kill [-signal process]

지정한 PID나 작업번호에 시그널을 보낸다.

getopts

명령행에서 지정한 유효한 옵션을 추출하기 위해 스크립트에서 쓴다.

login [username]

시스템을 사용하기 위해 들어온다.

newgrp [arg]

실제 그룹ID와 유효그룹ID를 바꾸어 사용자를 새로운 그룹에 할당한다.

pwd

현재 작업 디렉토리를 보여준다.

read [var]

표준 입력에서 읽은 내용을 변수 var에 저장한다.

readonly [var]

변수 var를 읽기 전용으로 만든다. 변수 var를 재설정할 수 있다.

return [n]

종료 상태를 n으로 반환하고, 함수로부터 복귀한다.

set

현재 쉘에서 선언된 변수 목록 확인한다.

shift [n]

위치인자를 지정한 n회 만큼 왼쪽으로 이동시킨다.

stop PID

지정한 PID의 프로세스를 중지시킨다.

suspend

현재 쉘의 수행을 정지시킨다.

times

현재 쉘에서 수행된 프로세스의 수행시간에 대한 정보를 출력한다.

trap [arg] [n]

쉘은 시그널 n에 대해 arg를 수행한다.

type [command]

명령어의 유형을 출력한다.

umask [octal | digits]

파일 생성시에 적용할 권한을 설정한다.

unset [name]

변수나 함수의 설정을 해제한다.

wait [PID]

백그라운드에서 수행되는 지정한 PID의 프로세스가 종료할 때까지 스크

립트를 중지한다.

ulimit [option size]

프로세스가 사용할 수 있는 자원의 최대 한계를 설정한다.

 

) --> 

) --> 

) --> 

 

[참고] 쉘별 내장 명령어 비교

) --> 

The shell command interpreters csh(1), ksh(1), and sh(1)

have special built-in commands. The commands case, for,

foreach, function, if, repeat, select, switch, until, and

while are commands in the syntax recognized by the shells.

They are described in the Commands section of the manual

pages of the respective shells. The remaining commands

listed in the table below are built into the shells for rea-

sons such as efficiency or data sharing between command

invocations. They are described on their respective manual

pages.

) --> 

------------------------------------------------------------

Command Shell

------------------------------------------------------------

alias csh, ksh

bg csh, ksh, sh

break csh, ksh, sh

case csh, ksh, sh

cd csh, ksh, sh

chdir csh, sh

continue csh, ksh, sh

dirs csh

echo csh, ksh, sh

eval csh, ksh, sh

exec csh, ksh, sh

exit csh, ksh, sh

export ksh, sh

false ksh

fc ksh

fg csh, ksh, sh

for ksh, sh

foreach csh

function ksh

getopts ksh, sh

glob csh

goto csh

hash ksh, sh

hashstat csh

history csh

if csh, ksh, sh

jobs csh, ksh, sh

kill csh, ksh, sh

let ksh

limit csh

login csh, ksh, sh

logout csh, ksh, sh

nice csh

newgrp ksh, sh

nohup csh

notify csh

onintr csh

popd csh

print ksh

pushd csh

pwd ksh, sh

read ksh, sh

readonly ksh, sh

rehash csh

repeat csh

return ksh, sh

select ksh

set csh, ksh, sh

setenv csh

shift csh, ksh, sh

source csh

stop csh, ksh, sh

suspend csh, ksh, sh

switch csh

test ksh, sh

time csh

times ksh, sh

trap ksh, sh

true ksh

type ksh, sh

typeset ksh

ulimit ksh, sh

umask csh, ksh, sh

unalias csh, ksh

unhash csh

unlimit csh

unset csh, ksh, sh

unsetenv csh

until ksh, sh

wait csh, ksh, sh

whence ksh

while csh, ksh, sh

------------------------------------------------------------

) --> 

 

변수 선언 방법

) --> 

# vi script.sh

 

.....

IP=172.16.10.134

.....

 

) --> 

# vi script.sh

 

.....

ping -c 1 $1

.....

 

) --> 

# ./script.sh 172.16.10.134

) --> 

# vi script.sh

 

.....

echo "Enter your name? : "

read NAME

.....

 

) --> 

# ./script.sh

Enter your name? : baik seoung chan

) --> 

) --> 

) --> 

) --> 

# vi script.sh

 

.....

while read LINE

do

) --> 

done < /tmp/.tmp1 > /tmp/.tmp2

.....

 

) --> 

# vi script.sh

 

......

for LINE in `cat /tmp/.tmp1`

do

) --> 

done > /tmp/.tmp2

......

 

) --> 

# vi script.sh

 

......

cat /tmp/.tmp1 | while read LINE

do

) --> 

done > /tmp/.tmp2

......

 

) --> 

) --> 

) --> 

) --> 

) -->