[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>
출처 : 리눅스 커맨드라인 완벽 입문서
'IT일반 > Linux' 카테고리의 다른 글
Command Line - 문자열과 수 (0) | 2022.06.17 |
---|---|
Command Line - 흐름 제어 : for 루프 (0) | 2022.06.13 |
Command Line - 흐름 제어 : Case 분기 (0) | 2022.06.07 |
Command Line - 문제 해결 (0) | 2022.06.06 |
Command Line - 흐름 제어 : While 루프와 Until 루프 (0) | 2022.06.06 |