본문 바로가기
네이버클라우드/Linux

Linux 8일차 (2023-05-03) Shell Script - 실습

by prometedor 2023. 5. 3.

Shell Script - 실습

if문

root@ysy:~/d80# vi if.sh

root@ysy:~/d80# ./if.sh
$b = 30

 

if ~ else 문

root@ysy:~/d80# vi ifelse.sh

root@ysy:~/d80# ./ifelse.sh
$b = 30

 

다중 if 문

root@ysy:~/d80# vi multiif.sh

root@ysy:~/d80# ./multiif.sh
$b = 30 F

 

for 문

root@ysy:~/d80# vi for.sh

root@ysy:~/d80# ./for.sh
 a = aa
 a = bb
 a = cc
 a = dd

 

while 문

root@ysy:~/d80# vi while.sh

root@ysy:~/d80# ./while.sh
 n = 1 , sum = 1
 n = 2 , sum = 3
 n = 3 , sum = 6
 n = 4 , sum = 10
 n = 5 , sum = 15
 n = 6 , sum = 21
 n = 7 , sum = 28
 n = 8 , sum = 36
 n = 9 , sum = 45
 n = 10 , sum = 55

 

until 문

root@ysy:~/d80# vi until.sh

root@ysy:~/d80# ./until.sh
 n = 1 , 1
 n = 2 , 2
 n = 3 , 3
 n = 4 , 4
 n = 5 , 5
 n = 6 , 6
 n = 7 , 7
 n = 8 , 8
 n = 9 , 9
 n = 10 , 10

 

case 문

root@ysy:~/d80# vi case.sh

root@ysy:~/d80# ./case.sh
Apple

 

continue, break

root@ysy:~/d80# vi continuebreak.sh

root@ysy:~/d80# ./continuebreak.sh
 == continue
 $i ==> 0
 $i ==> 1
 $i ==> 2
 $i ==> 3
 $i ==> 4
 $i ==> 6
 $i ==> 7
 $i ==> 8
 $i ==> 9
 == break
 $i ==> 0
 $i ==> 1
 $i ==> 2
 $i ==> 3
 $i ==> 4

 

select 문

root@ysy:~/d80# vi select.sh

root@ysy:~/d80# ./select.sh
1) ls -f
2) pwd
3) date
4) who
5) exit
 Select : 1
a1         h         k2                4000           kk          u2
ifelse.sh  u3        continuebreak.sh  .func1.sh.swp  k1          u
hh.sh      case.sh   for.sh            b.sh           aa          .
a1.c       ..        select.sh         if.sh          k3
func1.sh   until.sh  shift.sh          while.sh       multiif.sh
 Select : 2
/root/d80
 Select : 3
Wed May  3 09:52:49 PM KST 2023
 Select : 4
j        tty1         2023-05-03 10:46
j        pts/0        2023-05-03 10:46
j        pts/1        2023-05-03 10:47 (10.0.2.2)
j        pts/2        2023-05-03 10:47 (10.0.2.2)
j        pts/3        2023-05-03 11:54 (10.0.2.2)
j        pts/4        2023-05-03 11:54 (10.0.2.2)
j        pts/5        2023-05-03 12:08 (10.0.2.2)
j        pts/6        2023-05-03 12:08 (10.0.2.2)
j        pts/7        2023-05-03 15:06 (10.0.2.2)
j        pts/8        2023-05-03 15:09 (10.0.2.2)
j        pts/9        2023-05-03 17:55 (10.0.2.2)
j        pts/13       2023-05-03 16:20 (10.0.2.2)
j        pts/14       2023-05-03 16:20 (10.0.2.2)
j        pts/15       2023-05-03 17:14 (10.0.2.2)
j        pts/16       2023-05-03 17:14 (10.0.2.2)
 Select : 5

 

Shift 문

root@ysy:~/d80# vi shift.sh

root@ysy:~/d80# ./shift.sh
C언어 자료구조 UNIX 오라클
자료구조 UNIX 오라클
UNIX 오라클
오라클

------------------------
C언어 자료구조 UNIX 오라클
 shift 3
오라클

 

함수 - 1

root@ysy:~/d80# vi func1.sh

root@ysy:~/d80# ./func1.sh
 sub 함수입니다
 함수에서 인수 받기
 $1 = 한국인, $2 = 중국인
 함수에서 리턴하기
 return value = 20

 

함수 - 2

root@ysy:~/d80# vi func2.sh

root@ysy:~/d80# ./func2.sh
3 + 5 = 8

 

배열

==> 선언> 배열은 1차원만 지원함
root@ysy:~/d80# declare -a bb=(3 5 7)  --> bb 라는 리스트 만들기(공백으로 구분)
root@ysy:~/d80# echo $bb  --> bb의 첫번째 값 노출
3
root@ysy:~/d80# echo ${bb}  --> $bb 와 같음
3
root@ysy:~/d80# echo ${bb[0]}  --> bb의 첫 번째 값 출력 
3
root@ysy:~/d80# echo ${bb[1]}  --> bb의 두 번째 값 출력 
5
root@ysy:~/d80# echo ${bb[2]}  --> bb의 세 번째 값 출력 
7
root@ysy:~/d80# echo ${bb[*]}  --> $* 하나의 문자열에 모든 매개변수 포함
3 5 7
root@ysy:~/d80# echo ${bb[@]}  --> $@ 모든 매개변수를 각각 단어 단위로 분리하여 포함
3 5 7


==> 하나 추가
root@ysy:~/d80# declare -a bb[3]=4  --> bb배열의 4번째에 4라는 숫자 추가
root@ysy:~/d80# echo ${bb[*]} 
3 5 7 4
root@ysy:~/d80#


==> 특정 요소만 삭제
root@ysy:~/d80# unset bb[3]  --> bb배열의 4번째 값 삭제
root@ysy:~/d80# echo ${bb[*]}
3 5 7


==> 배열 개수 구하기
root@ysy:~/d80# echo ${#bb[@]}  --> bb배열의 개수
3
root@ysy:~/d80# bb[3]=4  --> 요소 하나 추가
root@ysy:~/d80# echo ${#bb[@]}  --> 하나 추가 되었으니 bb배열 개수 4개
4

root@ysy:~/d80# a[0]="aa"  --> aa 라는 문자열을 a배열의 첫 번째 값으로 넣음
root@ysy:~/d80# a[1]="bb"  --> bb 라는 문자열을 a배열의 두 번째 값을 넣음 
root@ysy:~/d80# echo $a[0] $a[1]  --> [0], [1] 을 인식을 못하여 첫 번째 인덱스 값만 불러옴
aa[0] aa[1]
root@ysy:~/d80# echo ${a[0]} ${a[1]}  --> 변수의 블록을 {} 로 감싸주어야 함
aa bb


==> 변수를 명확히 해주는 게 좋음
root@ysy:~/d80# a=30
root@ysy:~/d80# echo " \$a = $a입니다"
 $a = 30입니다
root@ysy:~/d80# echo " \$a = ${a}입니다"
 $a = 30입니다


==> 정수만 설정
root@ysy:~/d80# typeset -i k[3]
root@ysy:~/d80# k[0]=1
root@ysy:~/d80# k[1]=2
root@ysy:~/d80# k[2]=3
root@ysy:~/d80# echo ${k[*]}
1 2 3


==> 배열 길이 구하기
root@ysy:~/d80# echo ${#k[@]}
3
root@ysy:~/d80# echo ${#k[*]}
3


==> 반복할 때
root@ysy:~/d80# for i in "${k[@]}"
> do
> echo "$i"
> done
1
2
3
==> 배열 해제
root@ysy:~/d80# echo ${#k[*]}
3
root@ysy:~/d80# unset k  --> 배열 해제

root@ysy:~/d80# echo ${#k[*]}
0


==> 반드시 인접하지 않아도 됨. 연속적이지 않아도 됨.
root@ysy:~/d80# array[10]=40
root@ysy:~/d80# array[15]=50
root@ysy:~/d80# echo ${#array[*]}
2
root@ysy:~/d80# echo ${array[*]}
40 50

 

 

trap

^C, ^Z 등은 바로 종료됨  --> 태클
trap 명령은 시그널이 프로그램에 어떻게 대응할지 관리함

trap. kill signal 은 같음
kill -l
trap -l

ex)
trap 'echo "hahaha" > $HOME/yes' INT  --> 명령을 주고 태클(^C)을 걸기

root@ysy:~/d80# trap 'echo "hahaha" > $HOME/yes' INT
root@ysy:~# ls
d80  snap
root@ysy:~/d80# ^C

root@ysy:~/d80# cd ..
root@ysy:~# ls
d80  snap  yes



trap 'echo "hohoho" > $HOME/hoho' 2  --> 명령을 주고 태클(^C)을 걸기

root@ysy:~# trap 'echo "hohoho" > $HOME/hoho' 2
root@ysy:~# ls
d80  snap  yes
root@ysy:~# ^C

root@ysy:~# ls
d80  hoho  snap  yes

 

 

파일 관련

조건문 의미
[ -e file ] 존재 여부
[ -b file ] block
[ -c file ] char
[ -d file ] directory
[ -f file ] 존재하면서 일반 파일인가? (디렉터리, 장치파일 아님)
[ -g file ] SerGID
[ -L file ] symbolic link
[ -k file ] Sticky bit
[ -r file ] read
[ -u file ] setUID
[ -x file ] execute
[ -S file ] 0보다 큰 경우
[ ! -option file ] option이 거짓인 경우
[ file1 -nt file2 ] file1 이 더 최근 파일인지
[ file1 -ot file2 ] file1 이 더 최근 파일인지

예제

root@ysy:~/d80# ./a.sh
 Directory 맞아요..

 

**주의

ㄴ 쉘에서는 띄어쓰기도 명령어로 봄

root@ysy:~/d80# k = 50
k: command not found
root@ysy:~/d80# echo $k