본문 바로가기

Computer Science/Embedded Software

[Embedded Software] Shell Script 실습

+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다.

< 첫 번째 실습 - 터미널 시작 때마다 표시 설정 >

터미널이 시작될 때마다 다음과 같이 표시되도록 환경을 설정하라.

 

=> vi .bashrc : 터미널이 시작될 때마다 실행되는 .bashrc 파일을 수정한다.

echo ${LOGNAME^^} '!!!' # !를 사용할 때는 ''사용할 것
echo $(pwd)

끝 부분에  위 내용을 추가한다.


< 두 번째 실습 - 문자열 자르기 >

$PATH 값을 읽어서 한 줄에 한 PATH씩 출력하라 (cut 명령어와 while 반복문을 이용)

#!/bin/bash
# display path one by one from $PATH

i=1
a=$(echo $PATH | cut -d ':' -f $i) 
# a의 초기 값: PATH값을 ':'기준으로 자른 배열의 1번째 요소

while [ -n "$a" ] # a가 널 값이 아닐 동안 반복
do
	echo $a # a값 출력
  	((i++)) # i값 증가
   	a=$(echo $PATH | cut -d ':' -f $i) 
    # $PATH값을 ':' 기준으로 자른 배열의 i번째 요소로 업데이트
done

< 세 번째 실습 - 중복된 이름의 디렉토리 생성하기 >

오늘 날짜를 사용한 백업 디렉토리를 생성하라. (date +"%y%m%d" 명령어 사용)

ex) back220922

 

동일한 이름의 디렉토리가 존재하면 "back220922(1)"과 같이 다른 이름으로 생성하라.

+ 괄호 안의 숫자가 가장 큰 디렉토리가 가장 최근에 생성된 디렉토리이다.

 

#!/bin/bash

# 생성하려는 이름의 디렉토리 임시 저장
tmp_dir=back$(date +"%y%m%d") 

# 현재 위치에 tmp_dir가
if [ ! -d $tmp_dir ] # 존재하지 않는다면
then
	dir=$tmp_dir # tmp_dir 이름으로 생성
else # 존재하면
	nu=1
    while [ -d $tmp_dir\($nu\) ] # tmp_dir(nu)가 현재 위치에 이미 존재하면 반복
    do
    	((nu++))
    done
    dir=$tmp_dir\($nu\)
fi

mkdir $dir # 정한 이름으로 디렉토리 생성

 

""안에서 괄호를 사용할 시 \을 사용하지 않아도 정상적으로 사용이 가능하다.


< 네 번째 실습 - 백업 디렉토리에 파일 복사하기 >

세 번째 실습을 이용하여 백업 디렉토리 생성하고, / 디렉토리 하위의 모든 .txt파일을 백업하라.

 

백업 디렉토리로 복사되는 파일명이 같을 경우 .txt(1)과 같이 파일 이름을 변경하여 복사하라.

+ 가장 나중에 복사된 파일명의 숫자 가장 크도록 한다.

 

#!/bin/bash

tmp_dir=back$(date +"%y%m%d") 

if [ ! -d $tmp_dir ]
then
	dir=$tmp_dir
else 
	nu=1
    while [ -d "$tmp_dir($nu)" ]
    do
    	((nu++))
    done
    dir="$tmp_dir($nu)"
fi

mkdir $dir 

# 여기까지 세 번째 실습 코드

echo "$dir created ..." # 디렉토리 생성 표시

fres=$(sudo find / -name "*.txt") 
# / 디렉토리 하위의 모든 txt파일을 찾아서 fres에 저장 (공백으로 구분)

i=1 # 공백으로 구분된 fres를 i번째 요소로 접근

a=$(echo $fres | cut -d ' ' -f $i)
# a는 fres를 공백을 기준으로 자른 i번째 요소 (경로 + 이름)

while [ ! -z $a ] # a가 널이 아닐 동안 반복
do
	fn=$(basename $a) # 경로와 이름이 포함된 a값에서 이름만 추출
    
    if [ ! -f $dir/$fn ] # dir 디렉토리 안에 fn이란 이름이 존재하지 않는다면
    then
    	cp $a $dir # dir에 a를 복사
        echo "$a copied..." # 복사 확인 메세지 출력
    else
    	j=1
        while [ -f $dir/$fn\($j\) ] # dir에 fn(j) 파일이 있는 동안 반복
        do
        	((j++)) # j 증가
        done
        cp $a $dir/$fn\($j\) # a를 dir 디렉토리에 fn(j)이름으로 복사
        echo "$dir/$fn($j) copied..."
    fi
    ((i++)) # i 증가 -> fres의 그 다음 요소 접근
    a=$(echo $fres | cut -d ' ' -f $i)
done

< 다섯 번째 실습 - 복사할 디렉토리와 백업 파일 지정 >

네 번째 실습의 ShellScript에서 인자로 복사할 상위 디렉토리와 백업할 파일 형식을 지정하라.

#!/bin/bash

tmp_dir=back$(date +"%y%m%d") 

if [ ! -d $tmp_dir ]
then
	dir=$tmp_dir
else 
	nu=1
    while [ -d $tmp_dir\($nu\) ]
    do
    	((nu++))
    done
    dir=$tmp_dir\($nu\)
fi

mkdir $dir 

# 여기까지 세 번째 실습 코드

echo "$dir created ..." # 디렉토리 생성 표시

fres=$(sudo find $1 -name "$2") 
# / 디렉토리 하위의 모든 txt파일을 찾아서 fres에 저장 (공백으로 구분)

i=1 # 공백으로 구분된 fres를 i번째 요소로 접근

a=$(echo $fres | cut -d ' ' -f$i)
# a는 fres를 공백을 기준으로 자른 i번째 요소 (경로 + 이름)

while [ ! -z $a ] # a가 널이 아닐 동안 반복
do
	fn=$(basename $a) # 경로와 이름이 포함된 a값에서 이름만 추출
    
    if [ ! -f $dir/$fn ] # dir 디렉토리 안에 fn이란 이름이 존재하지 않는다면
    then
    	cp $a $dir # dir에 a를 복사
        echo "$a copied..." # 복사 확인 메세지 출력
    else
    	j=1
        while [ -f $dir/$fn\($j\) ] # dir에 fn(j) 파일이 있는 동안 반복
        do
        	((j++)) # j 증가
        done
        cp $a $dir/$fn\($j\) # a를 dir 디렉토리에 fn(j)이름으로 복사
        echo "$dir/$fn($j) copied..."
    fi
    ((i++)) # i 증가 -> fres의 그 다음 요소 접근
    a=$(echo $fres | cut -d ' ' -f $i)
done

+ while [ ! -z $a ] 을 사용할 것 (while [ -n $a ]은 무한 루프에 걸린다.)

 

-z 는 공백을 길이가 0으로 간주한다.