명령어 및 매개변수 확인하기
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이 출력된다.
참고문헌
'IT 공부 > Linux' 카테고리의 다른 글
[ Linux ] Shell Script(4) and Cron(scheduler) (0) | 2021.06.04 |
---|---|
[ Linux ] Shell script (3) (0) | 2021.06.03 |
[ Linux ] shell script기초(1) (0) | 2021.06.01 |
[ Linux ] 쉘 스크립트 이용해서 자동으로 명령 실행 (0) | 2021.05.31 |
[ Linux ] putty 와 telnet 설치 (0) | 2021.05.30 |