[cmd_test@btjeon-naver ~]$ cat > hello.sh
#!/bin/bash
# This is our first script.
echo 'Hello World!'
[cmd_test@btjeon-naver ~]$ ll hello.sh
-rw-rw-r-- 1 cmd_test cmd_test 62 Jun 3 13:51 hello.sh
[cmd_test@btjeon-naver ~]$ chmod u+x hello.sh
[cmd_test@btjeon-naver ~]$ ll hello.sh
-rwxrw-r-- 1 cmd_test cmd_test 62 Jun 3 13:51 hello.sh
[cmd_test@btjeon-naver ~]$ ./hello.sh
Hello World!
쉘 스크립트 작성 및 실행 기본 - 파일 생성 후에 반드시 실행(r) 권한을 줘야 한다.
[cmd_test@btjeon-naver ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/cmd_test/.local/bin:/home/cmd_test/bin
[cmd_test@btjeon-naver ~]$ mkdir bin
[cmd_test@btjeon-naver ~]$ mv hello.sh bin
[cmd_test@btjeon-naver ~]$ hello.sh
Hello World!
대부분의 리눅스 배포판은 bin 디렉토리를 사용자의 홈 디렉토리에 포함하도록 PATH 변수를 설정해 둔다. 해당 경로의 디렉토리를 만들고 sh 파일을 이동시키면 ./ 없이 바로 스크립트 파일명만으로 실행할 수 있다.
[cmd_test@btjeon-naver ~]$ vi sys_info_page
---------------------------------------------------------------------------------------------
#!/bin/bash
# Program to output a system information page
TITLE="System Information Report for $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"
echo "<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
</BODY>
</HTML>"
---------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ chmod u+x sys_info_page
[cmd_test@btjeon-naver ~]$ ./sys_info_page
<HTML>
<HEAD>
<TITLE>System Information Report for btjeon-naver</TITLE>
</HEAD>
<BODY>
<H1>System Information Report for btjeon-naver</H1>
<P>Generated 06/03/2022 02:31:00 PM KST, by cmd_test</P>
</BODY>
</HTML>
특정 값들을 변수(상수)로 설정해서 재사용할 수 있다. $HOSTNAME, $USER 등은 이미 정의되어 있는 변수들이다.
(변수 할당문에는 변수명, 등호, 변수값 사이에 빈 칸이 없어야 한다.)
[cmd_test@btjeon-naver ~]$ a=z
[cmd_test@btjeon-naver ~]$ echo $a
z
[cmd_test@btjeon-naver ~]$ b="a string"
[cmd_test@btjeon-naver ~]$ echo $b
a string
[cmd_test@btjeon-naver ~]$ c="a string and $b"
[cmd_test@btjeon-naver ~]$ echo $c
a string and a string
[cmd_test@btjeon-naver ~]$ d=$(ls -l foo.txt)
[cmd_test@btjeon-naver ~]$ echo $d
-rw-rw-r-- 1 cmd_test cmd_test 46 Jun 2 16:26 foo.txt
[cmd_test@btjeon-naver ~]$ e=$((5*7))
[cmd_test@btjeon-naver ~]$ echo $e
35
변수 값 할당 예
[cmd_test@btjeon-naver ~]$ vi sys_info_page_here
--------------------------------------------------------------------------------------------
#!/bin/bash
# Program to output a system information page
TITLE="System Information Report for $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"
cat << _EOF_
"<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
</BODY>
</HTML>"
_EOF_
--------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./sys_info_page_here
"<HTML>
<HEAD>
<TITLE>System Information Report for btjeon-naver</TITLE>
</HEAD>
<BODY>
<H1>System Information Report for btjeon-naver</H1>
<P>Generated 06/03/2022 02:59:48 PM KST, by cmd_test</P>
</BODY>
</HTML>"
쉘 스크립트에서 echo 명령어 대신 cat 명령어와 here 문서를 사용했다. (_EOF_ 문자열이 token으로 사용되었다.)
here 문서는 I/O 리다이렉션이 추가적인 형태로 텍스트 본문을 스크립트에 삽입할 때 그리고 명령어의 표준 입력으로 보낼 때 사용한다. 이는 다음과 같은 방식으로 사용된다.
command << token
text
token
[cmd_test@btjeon-naver ~]$ cat << _EOF_
> $foo
> "$foo"
> '$foo'
> \$foo
> _EOF_
some text
"some text"
'some text'
$foo
here 문서를 사용하는 것은 echo 명령과 별반 차이는 없지만, 위와 같이 쉘이 인식하는 따옴표 및 쌍따옴표의 의미가 사라진다. 쉘은 인용 기호를 전혀 신경 쓰지 않는다. 그저 일반적인 문자일 뿐이다.
[cmd_test@btjeon-naver ~]$ vi ftp_get_diction.sh
----------------------------------------------------------------------------------------------
#!/bin/bash
# Script to retrieve a file via FTP
FTP_SERVER=ftp.gnu.org
FTP_PATH=gnu/diction
REMOTE_FILE=diction-1.11.tar.gz
ftp -n <<- _EOF_
open $FTP_SERVER
user anonymous cmd_test@btjeon-naver
cd $FTP_PATH
get $REMOTE_FILE
bye
_EOF_
ls -l $REMOTE_FILE
----------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./ftp_get_diction.sh
Trying 209.51.188.20...
WARNING! 554 bare linefeeds received in ASCII mode
File may not have transferred correctly.
-rw-rw-r-- 1 cmd_test cmd_test 141057 Jun 3 15:18 diction-1.11.tar.gz
here 문서를 사용한 ftp download script 예제이다. 리다이렉션 기호인 << 기호를 <<- 기호로 바꾸면 쉘은 here 문서에서의 선행되어 나오는 탭 기호들을 무시하게 된다. 이렇게 가독성 향상을 위해 들여쓰기가 가능해진다.
[cmd_test@btjeon-naver ~]$ vi funct_test.sh
--------------------------------------------------------------------------------------------
#!/bin/bash
# Shell function demo
function funct {
echo "Step 2"
return
}
# Main program starts here
echo "Step 1"
funct
echo "Step 3"
--------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./funct_test.sh
Step 1
Step 2
Step 3
스크립트 내에서 함수 사용 예제이다. 함수 호출이 쉘 함수로 인식이 되고 다른 프로그램으로 해석되지 않기 위해서 쉘 함수는 호출이 되기 전에 반드시 먼저 정의되어야 한다.
[cmd_test@btjeon-naver ~]$ vi sys_info_page_here
---------------------------------------------------------------------------------------------
#!/bin/bash
# Program to output a system information page
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() {
cat <<- _EOF_
<H2>Home Space Utilization</H2>
<PRE>$(du -sh /home/*)</PRE>
_EOF_
return
}
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_
---------------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ ./sys_info_page_here
"<HTML>
<HEAD>
<TITLE>System Information Report for btjeon-naver</TITLE>
</HEAD>
<BODY>
<H1>System Information Report for btjeon-naver</H1>
<P>Generated 06/03/2022 04:43:10 PM KST, by cmd_test</P>
<H2>System Uptime</H2>
<PRE> 16:43:10 up 19 days, 23:56, 2 users, load average: 0.01, 0.02, 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</H2>
<PRE>5.7M /home/cmd_test</PRE>
</BODY>
</HTML>"
기존 보고서 생성 스크립트에서 함수 정의 및 호출 기능을 추가했다.
[cmd_test@btjeon-naver ~]$ vi local-vars.sh
----------------------------------------------------------------------------------------
#!/bin/bash
# local-vars.sh : script to demonstrate local variables
foo=0 # global variable foo
funct_1() {
local foo # variable foo local to funct_1
foo=1
echo "funct_1: foo = $foo"
}
funct_2() {
local foo # variable foo local to funct_2
foo=2
echo "funct_2: foo = $foo"
}
echo "global: foo = $foo"
funct_1
echo "global: foo = $foo"
funct_2
echo "global: foo = $foo"
----------------------------------------------------------------------------------------
[cmd_test@btjeon-naver ~]$ chmod u+x local-vars.sh
[cmd_test@btjeon-naver ~]$ ./local-vars.sh
global: foo = 0
funct_1: foo = 1
global: foo = 0
funct_2: foo = 2
global: foo = 0
지역 변수를 정의하고 사용하는 예제
출처 : 리눅스 커맨드라인 완벽 입문서
'IT일반 > Linux' 카테고리의 다른 글
Command Line - 키보드 입력 읽기 (0) | 2022.06.06 |
---|---|
Command Line - 흐름 제어 : if 분기 (0) | 2022.06.03 |
Command Line - 프로그램 컴파일 (0) | 2022.06.03 |
Command Line - 출력 포맷 지정 (0) | 2022.06.02 |
Command Line - 텍스트 편집 (0) | 2022.06.01 |