내가 한 노력들

[ Linux ] shell script (2) 본문

IT 공부/Linux

[ Linux ] shell script (2)

JONGI-N CHOI 2021. 6. 2. 18:38

 

명령어 및 매개변수 확인하기

 

s3.sh

#!/bin/bash
echo "\$0=$0"
echo "\$1=$1"
echo "\$#=$#"

$0이 의미하는건 입력된 명령어가 무엇인지 보여준다

$1이 의미하는건 첫번째 매개변수 ( 2는 두번째 3은 세번째...)

$#이 의미하는건 매개변수의 갯수를 의미한다.

 

./s3.sh 해당 파일을 실행해보면, $0은 실행한 명령어인 ./s3.sh가

매개변수는 없었기 때문에 $1에는 공백이고

매개변수의 갯수를 나타내는 $#에는 0의 값이 나온다.

 

./s3.sh aaa bbb로 실행했을 경우에는, 매개변수가 2개(aaa, bbb)이므로 $1에는 aaa값이

$#에는 2의 값이 표시되는 것을 볼 수 있다.

 

IF문과의 응용

#!/bin/bash if [ $# -eq 0 ]; then echo "Input the filename, please.." echo "usage) ./s4.sh <format-file> <data-file> <test-file>" exit 0 fi cat $1

 

shell에서는 대소관계를 나타내는 >, <, >=, <=, ==, !=을 문자로 사용하고 있는데 그게 표로 나타내면

 

-gt >
-ge >=
-lt <
-le <=
-eq ==
-ne !=

 

위의 코드는 $#(매개변수의 개수)가 0이면, 해당 문구를 출력하고 종료

exit는 문제가 없으면 0, 있으면 1을 리턴

 

매개변수가 입력이되면 해당 매개변수(파일)의 내용을 출력하는 코드인 것이다.

 

날짜관련 쉘

#!/bin/bash 
date date +%Y-%m-%d
date "+%Y-%m-%d %H:%M:%S" 
date +%Y-%m-%d --date=yesterday 
date +%Y-%m-%d --date=tommorow 
date +%Y-%m-%d --date='1 day ago'
date +%Y-%m-%d --date='1 day' 
date +%Y-%m-%d --date='1 month ago'

 

 

date로 날짜값을 받아올 수 있다.

+는 포멧팅을 하겠다는 의미

 

%a 요일을 영어의 약어로 ( sun, sta...)
%A 요일을 영어 풀네임으로
%b 월 이름을 영어의 약어로 (jan, act..)
%B 월 이름을 영어 풀네임으로
%y 년도를 뒤의 두자리로 (92, 94...)
%Y 년도를 4자리로 표현
%m
%d
%H 시간
%M
%s
%D %m/%d/%y 의 포멧형태로 보여줌 (02/06/21)
%T %H:%M:%s의 포멧형태로 보여줌 (18:08:52)
%p AM인지 AP인지

 

 

응용 ( 기존파일의 이름을 현재 날짜로 변경하기)

#!/bin/bash
if [ $# -ne 1 ];then 
	echo "Input the filename, please.." 
    echo "usage) ./s6.sh <to-change-file>"
    exit 0 
fi 

DATE=`date +%Y%m%d` 
FN="${DATE}.txt"
mv $1 $FN

 

우선 if문으로 매개변수(파일명)이 입력이 되었는지를 체크한다.

 

그리고 DATE 변수에 현재 날짜를 포멧형식으로 저장하고

FN에 변경할 파일 이름을 변수로 저장한다.

mv 명령어를 이용해서 매개변수의 입력된 파일이름 ($1)을 오늘날짜로 만들어둔 파일이름 변수로 ($FN)변경

 

응용(두개의 파일을 합치고 파일이름을 하루전 날짜인 로그파일로 바꾼다)

#!/bin/bash
if [ $# -ne 2 ]; then 
	echo "please, Input 2 filename" 
    echo "./s7.sh <filename1> <filename2>" 
    exit 0 
fi

DATE=`date +%Y%m%d --date='1 day ago'` 
FN=${DATE}.log 
cat $1 >> $2 
rm $1 
mv $2 $FN

 

우선 if문을 통해서 매개변수(파일명)이 2개가 들어왔는지를 체크

이번에는 --date를 이용해서 하루전 날짜를 DATE에 저장하고 $FN에 파일이름 저장

"cat >> "을 이용해서 첫번째 파일을 두번째 파일에 붙혀넣기 (합치기)

그다음에 기존에 있던 파일 $1은 rm으로 삭제하고

합쳐진 두번째파일 $2은 mv를 통해서 만들어놓은 하루전 날짜인 파일명으로 변경한다.

 

 

2중 for문을 통해 구구단 표현

#!/bin/bash for i in {2..9} do for j in {1..9} do # $(())안에 있는 것은 연산을 하라는 의미이다. # expr 도 마찬가지로 연산을 하라는 명령어다 `expr 1 + 2` 하면 결과는 3이 나온다. echo "$i * $j = $(( $i * $j ))" done echo "====================" done

 

여기서는 $(( ))가 괄호안에있는 것을 연산을 하라는 표현으로 사용된다 .

expr로도 연산하라는 명령을 대체할 수 있음

 

배열

#!/bin/bash 
arr=("aaaaa" "bbbb" "cccc" 123) 
echo $arr echo ${arr[1]} 
arr[4]="4444"
arr[8]="ffff" 
arr[5]="5555" 

#@는 all을 의미
echo ${arr[@]}

# #는 갯수를 의미한다 (배열의 원소 갯수가 몇개인지) 
echo "${#arr[@]}"

for i in ${arr[@]} 
do 
	echo 
$i done

 

배열 표현은 ()으로 한다.

일반적인 프로그래밍 언어와 거의 동일한데 특이한 점은

#과 @의 사용이다.

 

#은 갯수를 의미한다. 원소의 문자열 갯수 또는 행렬의 갯수를 셀때 사용한다

@는 all을 의미해서 원소의 모든 것을 가르킨다.

따라서 ${arr[@]}는 arr행렬의 모든 원소를 의미하므로

위의 코드에서의 출력값은 aaaaa, bbbb, cccc, 123, 4444, ffff, 5555가 출력된다.

 

거기에 #를 붙히게되면 ${#arr[@]} arr행렬의 모든 원소의 갯수를 의미하게 되므로 7이 출력된다.

 

 

참고문헌

https://www.youtube.com/watch?v=035pZp2R50M&list=PLEOnZ6GeucBVj0V5JFQx_6XBbZrrynzMh&index=11&ab_channel=%EC%8B%9C%EB%8B%88%EC%96%B4%EC%BD%94%EB%94%A9indiflex