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 변수에 콜론(:)을 저장한다.
특수 변수 OPTIND는 1로 초기화한 후, 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
) --> # chmod +x args.sh # ./args.sh -a
) --> # ./args.sh -a -t
) --> # ./args.sh -l
) --> # ./args.sh
) --> (결론) 옵션 처리에 대해서는 많은 방법이 존재할 수 있지만 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 ...... |
) -->
) -->
) -->
) -->
) -->
'Learning > └◆Shell Scripts' 카테고리의 다른 글
쉘 스크립트 코드 분석 (0) | 2016.12.14 |
---|---|
배시(bash)쉘 스크립트 작성시 대표적인 명령어 (0) | 2016.12.14 |
[Shell Scripting] 본(Born) 쉘 프로그래밍_3 (0) | 2016.12.12 |
[Shell Scripting] 본(Born) 쉘 프로그래밍_2 (0) | 2016.12.12 |