본문 바로가기
IT일반/Linux

Command Line - 위치 매개변수

by 버섯도리 2022. 6. 8.
[cmd_test@btjeon-naver ~]$ vi posit_param.sh
---------------------------------------------------------------------------------------------
#!/bin/bash

# posit_param : script to view command line parameters

echo "
\$0 = $0
\$1 = $1
\$2 = $2
\$3 = $3
\$4 = $4
\$5 = $5
\$6 = $6
\$7 = $7
\$8 = $8
\$9 = $9
"
---------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./posit_param.sh 

$0 = ./posit_param.sh
$1 = 
$2 = 
$3 = 
$4 = 
$5 = 
$6 = 
$7 = 
$8 = 
$9 =

[cmd_test@btjeon-naver ~]$ ./posit_param.sh a b c d

$0 = ./posit_param.sh
$1 = a
$2 = b
$3 = c
$4 = d
$5 = 
$6 = 
$7 = 
$8 = 
$9 =

변수 $0 ~ $9까지의 값을 표시하는 스크립트. $0은 항상 프로그램의 경로명을 가리킨다.

9보다 큰 수를 지정하기 위해서는 중괄호를 사용하면 된다. (ex : ${10}, ${11})

 

[cmd_test@btjeon-naver ~]$ vi posit_param.sh
-------------------------------------------------------------------------------------------
#!/bin/bash

# posit_param : script to view command line parameters

echo "
Number of arguments: $#
\$0 = $0
\$1 = $1
\$2 = $2
\$3 = $3
\$4 = $4
\$5 = $5
\$6 = $6
\$7 = $7
\$8 = $8
\$9 = $9
"
-------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./posit_param.sh a b c d

Number of arguments: 4
$0 = ./posit_param.sh
$1 = a
$2 = b
$3 = c
$4 = d
$5 = 
$6 = 
$7 = 
$8 = 
$9 =

$# 변수는 커맨드라인의 인자 수를 넘겨주는 변수이다.

 

[cmd_test@btjeon-naver ~]$ vi posit_param2.sh
------------------------------------------------------------------------------------------
#!/bin/bash

# posit_param2 : script to display all arguments

count=1

while [[ $# -gt 0 ]]; do
        echo "Argument $count = $1"
        count=$((count + 1))
        shift
done
------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./posit_param2.sh a b c d
Argument 1 = a
Argument 2 = b
Argument 3 = c
Argument 4 = d

shift 명령어는 실행될 때마다 각 매개변수가 "하나씩 다음으로 이동"하게끔 한다. ($2의 값은 $1로, $3의 값은 $2로 차례차례 이동한다. 또한 $#의 값은 1씩 감소한다.

 

[cmd_test@btjeon-naver ~]$ vi file_info.sh
------------------------------------------------------------------------------------------
#!/bin/bash

# file_info : simple file information program

PROGNAME=$(basename $0)

if [[ -e $1 ]]; then
        echo -e "\nFile Type : "
        file $1
        echo -e "\nFile Status : "
        stat $1
else
        echo "$PROGNAME: usage: $PROGNAME file" >&2
        exit 1
fi
------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./file_info.sh distros.txt 

File Type : 
distros.txt: ASCII text

File Status : 
  File: ‘distros.txt’
  Size: 343       	Blocks: 8          IO Block: 4096   regular file
Device: ca01h/51713d	Inode: 102363914   Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/cmd_test)   Gid: ( 1001/cmd_test)
Access: 2022-06-10 06:21:02.457112390 +0900
Modify: 2022-06-02 10:46:21.178668983 +0900
Change: 2022-06-02 15:16:30.010695744 +0900
 Birth: -
[cmd_test@btjeon-naver ~]$ ./file_info.sh
file_info.sh: usage: file_info.sh file

위치 매개변수를 활용한 파일 정보 확인 스크립트

 

<특수 매개변수 *와 @>

매개변수 설명
$* 항목 1부터 시작하여 위치 매개변수 목록으로 확장된다. 이것을 쌍따옴표로 둘러싸면 쌍따옴표 내의 문자열 모두가 위치 매개변수로 확장되고 각각 IFS 쉘 변수의 첫번째 문자(기본값은 공백)에 의해 구분된다.
$@ 항목 1부터 시작하여 위치 매개변수 목록으로 확장된다. 이것을 쌍따옴표로 둘러싸면 각 위치 매개변수는 쌍따옴표로 구분된 단어로 확장된다.

 

[cmd_test@btjeon-naver ~]$ vi posit_param3.sh
---------------------------------------------------------------------------------------------
#!/bin/bash

# posit_param3 : script to demonstrate $* and $@

print_params () {
        echo "\$1 = $1"
        echo "\$2 = $2"
        echo "\$3 = $3"
        echo "\$4 = $4"
}

pass_params () {
        echo -e "\n" '$* :';    print_params $*
        echo -e "\n" '"$*" :';  print_params "$*"
        echo -e "\n" '$@ :';    print_params $@
        echo -e "\n" '"$@" :';  print_params "$@"
}

pass_params "word" "words with spaces"
---------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./posit_param3.sh 

 $* :
$1 = word
$2 = words
$3 = with
$4 = spaces

 "$*" :
$1 = word words with spaces
$2 = 
$3 = 
$4 = 

 $@ :
$1 = word
$2 = words
$3 = with
$4 = spaces

 "$@" :
$1 = word
$2 = words with spaces
$3 = 
$4 =

특수 매개변수 $*와 $@를 4가지 방식으로 사용한 예제

 

더보기

조금 더 완성도 있는 sys_info_page script

[cmd_test@btjeon-naver ~]$ vi sys_info_page_here3
---------------------------------------------------------------------------------------
#!/bin/bash

# sys_info_page: Program to output a system information page

PROGNAME=$(basename $0)
TITLE="System Information Report for $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"

report_uptime() {
        cat <<- _EOF_
                <H2>System Uptime</H2>
                <PRE>$(uptime)</PRE>
                _EOF_
        return
}

report_disk_space() {
        cat <<- _EOF_
                <H2>Disk Space utilization</H2>
                <PRE>$(df -h)</PRE>
                _EOF_
        return
}

report_home_space() {
        if [[ $(id -u) -eq 0 ]]; then
                cat <<- _EOF_
                        <H2>Home Space Utilization (All Users)</H2>
                        <PRE>$(du -sh /home/*)</PRE>
                        _EOF_
        else
                cat <<- _EOF_
                        <H2>Home Space Utilization ($USER)</H2>
                        <PRE>$(du -sh $HOME)</PRE>
                        _EOF_
        fi                      
        return
}

usage() {
        echo "$PROGNAME: usage: $PROGNAME [-f file | -i]"
        return
}

write_html_page() {
        cat <<- _EOF_
        <HTML>
                <HEAD>
                        <TITLE>$TITLE</TITLE>
                </HEAD>
                <BODY>
                        <H1>$TITLE</H1>
                        <P>$TIME_STAMP</P>
                        $(report_uptime)
                        $(report_disk_space)
                        $(report_home_space)
                </BODY>
        </HTML>
        _EOF_
        return
}

# process command line options

interactive=
filename=

while [[ -n $1 ]]; do
        case $1 in
                -f | --file)            shift
                                        filename=$1
                                        ;;
                -i | --interactive)     interactive=1
                                        ;;
                -h | --help)            usage
                                        exit
                                        ;;
                *)                      usage >&2
                                        exit 1
                                        ;;
        esac
        shift
done

# interactive mode

if [[ -n $interactive ]]; then
        while true; do
                read -p "Enter name of output file: " filename
                if [[ -e $filename ]]; then
                        read -p "'$filename' exists. Overwrite? [y/n/q] > "
                        case $REPLY in
                                Y|y)    break
                                        ;;
                                Q|q)    echo "Program terminated."
                                        exit
                                        ;;
                                *)      continue
                                        ;;
                        esac
                elif [[ -z $filename ]]; then
                        continue
                else
                        break
                fi
        done
fi

# output html page

if [[ -n $filename ]]; then
        if touch $filename && [[ -f $filename ]]; then
                write_html_page > $filename
        else
                echo "$PROGNAME: Cannot write file '$filename'" >&2
                exit 1
        fi
else
        write_html_page
fi
---------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./sys_info_page_here3
<HTML>
<HEAD>
<TITLE>System Information Report for btjeon-naver</TITLE>
</HEAD>
<BODY>
<H1>System Information Report for btjeon-naver</H1>
<P>Generated 06/16/2022 06:15:33 AM KST, by cmd_test</P>
<H2>System Uptime</H2>
<PRE> 06:15:33 up 32 days, 13:29,  1 user,  load average: 0.00, 0.01, 0.05</PRE>
<H2>Disk Space utilization</H2>
<PRE>Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        481M     0  481M   0% /dev
tmpfs           491M     0  491M   0% /dev/shm
tmpfs           491M   56M  435M  12% /run
tmpfs           491M     0  491M   0% /sys/fs/cgroup
/dev/xvda1       50G  2.4G   48G   5% /
tmpfs            99M     0   99M   0% /run/user/0</PRE>
<H2>Home Space Utilization (cmd_test)</H2>
<PRE>5.9M	/home/cmd_test</PRE>
</BODY>
</HTML>
[cmd_test@btjeon-naver ~]$ ./sys_info_page_here3 -f sys_info3.html
[cmd_test@btjeon-naver ~]$ cat sys_info3.html 
<HTML>
<HEAD>
<TITLE>System Information Report for btjeon-naver</TITLE>
</HEAD>
<BODY>
<H1>System Information Report for btjeon-naver</H1>
<P>Generated 06/16/2022 06:20:41 AM KST, by cmd_test</P>
<H2>System Uptime</H2>
<PRE> 06:20:41 up 32 days, 13:34,  1 user,  load average: 0.00, 0.01, 0.05</PRE>
<H2>Disk Space utilization</H2>
<PRE>Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        481M     0  481M   0% /dev
tmpfs           491M     0  491M   0% /dev/shm
tmpfs           491M   56M  435M  12% /run
tmpfs           491M     0  491M   0% /sys/fs/cgroup
/dev/xvda1       50G  2.4G   48G   5% /
tmpfs            99M     0   99M   0% /run/user/0</PRE>
<H2>Home Space Utilization (cmd_test)</H2>
<PRE>5.9M	/home/cmd_test</PRE>
</BODY>
</HTML>

 

 

 

 

 

 

출처 : 리눅스 커맨드라인 완벽 입문서