Linux bash shell script 기본 사용법
1. shell script의 시작
shell script의 시작은 다음으로 시작한다.
!#/bin/sh
2. 문자열 출력
문자열의 출력은 다음과 같다.
echo "hello" #자동 줄바꿈
printf "hello" #c언어와 비슷
3. 주석
주석은 #으로 시작합니다.
# 이것은 주석입니다.
function {
#주석입니다.
ehco "hello"
}
4. 변수의 선언
쉘 스크립트에서 변수명은 대소문자 구분하지 않는다.
기본적으로 전역변수이며 변수 앞에 local을 붙여서 지역변수로 사용할 수 있다..
변수명과 값은 "="로 구분하며, 공백 없이 변수명=값으로 지정한다.
기본적으로 변수명에 할당된 값음 모두 문자열로 인식한다.
선언된 변수는 해당 스크립트에서만 유효하며 다른 쉘 스크립트에서도 사용하려면 export를 붙여서 환경변수로 만들어야 한다.
변수의 해제는 unset로 한다.
아래의 예제에서 var1, var2는 모두 문자열로 인식한다.
var1=1
var2="1"
할당된 변수를 사용하기 위해서는 $, ${변수명}를 사용하여 할당된 변수를 사용한다.
var=1
echo $var
${변수명}을 사용할 경우에는 변수에 담긴 값에 연산을 이용할 수 있다.
사용법 | 설명 |
${변수명:위치} | 위치 다음부터 문자열 추출 |
${변수명:위치:길이} | 위치 다음부터 지정한 길이만큼 문자열 추출 |
${변수명:-기본값} | 변수가 값이 없을 경우 기본값 지정 |
${변수명:?값} | 변수의 값이 없을 경우 값출력 후 스크립트 종료 |
${변수명?값} | 변수 미선언시에 값 출력 후 스크립트 종료 |
${#변수명} | 문자열 길이 |
#!/bin/bash
value="abcdef"
echo ${#value} #변수값의 길이 출력
#result=>6
echo ${value:2} #특정 위치부터 출력
#result=> cdef
echo ${value:2:2} #특정 위치부터 길이만큼 출력
#result=>cd
# null이면 입력값 초기화 후 출력, 아니면 변수값 출력
echo ${value=ghijkl}
echo ${value2=ghijkl}
#result=>abcde
#result=>ghijkl
#null이 아니면 입력값 출력, 아니면 빈값 출력
echo ${value+ghijkl}
echo ${value2+ghijkl}
#result=>ghijkl
#result=>
#null이면 입력값 출력, 아니면 변수값 출력
echo ${value-ghijkl}
echo ${value2-ghijkl}
#result=>abcdef
#result=>ghijkl
#null이면 오류, 아니면 변수값 출력
echo ${value?ghijkl}
echo ${value2?ghijkl}
#result=>abcdef
#result=>./test.sh line x: value: ghijkl
변수는 특수 매개변수를 제공한다.
- $$ : 현재 스크립트의 PID
- $? : 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태
- $! : 최근에 실행한 백그라운드(비동기) 명령의 PID
- $- : 현재 옵션 플래그
- $_ : 지난 명령의 마지막 인자로 설정된 특수 변수
만약 할당된 변수를 숫자로 사용하고 싶다면 expr 명령어를 사용한다.
또 다른 방법은 $(()) 감싸고 계산 하는 방법이 있다. $(()) 계산식 안에 있는 숫자들은 문자열이 아니라 숫자로 연산이 된다.
var1=1
var2="2"
echo `expr $var1 + $var2`
echo $(($var1 + $var2))
5. 배열의 선언
쉘 스크립트는 1차원 배열만 사용한다. 배열을 선언할 때는 인덱스가 연결되지 않아도 되며 배열의 선은은 다음과 같다.
#!/bin/bash
#배열에 값 할당
array[0]="1"
array[1]="2"
array[2]="3"
#한번에 배열 선언
array=("1", "2", "3")
#배열의 값 사용
echo ${array[0]}
#배열 전체 길이 출력 : ${#array[@]}
#전체 출력 : ${array[@]}
#배열의 복사
array=(${array[@]} "2")
6. 파라메터 전달
쉘을 수행할때 파라메터를 던져 줄 수 있다.
쉘을 수행할때 파라메터는 /test.sh 123 456 678 형태로 넘겨줄 수 있으며 수행되는 쉘 안에서는 $1 ~$9 형태로 받을 수 있다. 10번째 인자부터는 ${}로 감싸줘야 한다. 넘겨받은 인자는 몇가지 형태가 있으며 다음과 같다.
- $0 : 실행된 스크립트명
- $1~n : 넘겨받은 인자의 순서의 넘어온 값 $1, $2 ... $9 ... ${10}, ${11}....
- $* : 전체 인자 값
- $@ : 전체 인자 값
- $# : 매개 변수의 총 갯수
7. 커맨드
- 쉘 스크립트에서는 $(리눅스 명령어)의 결과인 표준 출력을 문자열로 치환한다.
- 물론 변수에 할당도 가능하다. ex. today=$(date)
8. 따옴표
쉘 스크립트에서는 쌍따옴표(Double Quotation), 따옴표(Single Quotation), 역따옴표(Backquote)가 모두 다르다.
-
쌍따옴표는 특수기호가 동작하는 문자열이다.
-
작은 따옴표는 특수기호를 그대로 출력한다.
-
역따옴표는 명령을 실행한 후 결과를 반환하는 따옴표이다.
#!/bin/bash
var1="hello"
var2="world"
var3="!!!"
echo "${var1} ${var2} ${var4}"
#result=> hello world !!!
echo '${var1} ${var2} ${var4}'
#result=> ${var1} ${var2} ${var4}
total=`free | grep Mem | awk '{print $2}'`
문자에서 특수문자를 사용하기 위해서는 다음과 같이 한다.
쌍따옴표 | "\"" '"' |
쌍따옴표는 특수기호를 작성할 때 역슬러시를 이용 따옴표는 특수기로를 그대로 출력 |
따옴표 | "'" | 따옴표는 표기할 방법이 없음 |
역실러시 | "\\" '\' |
역슬러시도 역슬러시로 표시할 수 있다. 따옴표는 특수기호를 그대로 출력 |
'DEVELOPMENT > Linux' 카테고리의 다른 글
[linux]mount 명령어를 통한 디렉터리 연결하기 (0) | 2023.03.23 |
---|---|
파일 감시를 위한 inotifywait (0) | 2020.08.20 |
logroate 옵션 (0) | 2017.11.22 |
특정 계정으로 쉘 실행하기 (0) | 2017.11.15 |
CentOS7 방화멱(firewalld) 설정 (0) | 2017.04.24 |
[SHELL] 특정 날짜를 입력받아 지정된 날짜까지 LOOP 실행하기
사용자의 특정 날짜를 입력 받아서 지정된 날짜까지 일별로 loop를 돌면서 처리해야 하는 경우
해당 쉡을 사용한다.
간단하지만 변수에 담긴 date를 증가 및 감소 하는 법을 알지 못해 고생했다.
실행방법은 ./dateLoopRunShell.sh 20101120 형태로 사용하면 인자는 yyyymmdd 형태의 시작일을 입력한다.
해당 쉘의 종료일은 쉘을 실행시키는 시점의 날짜가 되며 20101120 ~ 현재일까지 날짜를 출력한다.
20101120
20101121
20101122
20101123
.
.
.
20150128
echo 부분을 주석처리 하고 해당 부분에 처리할 로직을 넣어서 실행한다.
dateLoopRunShell.sh
#!/bin/bash
echo "HELLO SHELL"
START=$(date --date=$1 +"%Y%m%d")
END=$(date +"%Y%m%d")
CURRENT="$START"
#echo `date -d "$CURRENT 1 day" +"%Y%m%d"`
while [ "$CURRENT" != "$END" ]; do
echo $CURRENT
#run shell job
CURRENT=`date -d "$CURRENT 1 day" +"%Y%m%d"`
done
'DEVELOPMENT > Linux' 카테고리의 다른 글
crontab 설명 (0) | 2015.05.06 |
---|---|
centos inotify install (0) | 2015.04.22 |
windows OS 에서 port 및 프로세스 확인 (0) | 2014.04.08 |
[linux]ssh 비밀번호 없이 접속하기 (0) | 2013.04.25 |
centos 5.3 svn 설치 (0) | 2012.06.01 |
Java Process Kill Script
ps -ef | grep java | grep -v grep | awk '{print "kill " $2}' | sh -v
[출처] http://www.imnuz.net/entry/Java-Process-Kill-Script?category=40
'DEVELOPMENT > Java' 카테고리의 다른 글
windows에서 java application을 background에서 실행 (0) | 2014.03.19 |
---|---|
java 화면캡쳐 샘플 (0) | 2013.12.04 |
jdom을 이요한 XML 쓰기와 읽기 (0) | 2013.08.23 |
eclipse SWT/JFace 라이브러리 추가 (0) | 2013.06.12 |
java openGL (0) | 2012.08.23 |
linux shell 스크립트
파일구조
#내용
exit 0
변수선언
a = 0 (X)
b="aaaa bbbb"
변수사용
$b
echo $a
$(($a + 10))
인자값(argument)
$* : 각 인자를 나누지 않고 통틀어 참조
$@ : $*와 같지만 quoting(escape)된 문자열로 취급
$0 : 실행된 쉘스크립트 이름
$1, $2, ... 쉘, 함수 호출시 넘어온 매개변수
if문
...
fi
if [표현식]; then
...
elif [표현식]; then
...
else
...
fi
test, [] :
- test는 조건을 판별하여 0(true)/1(false)를 반환한다.
- test는 쉘 내장명령이며, []은 이것의 또다른 표기법이다.
- test는 보통 독립적으로 쓰이지않고, if, case, while 등의 뒤에 붙어 조건을 판별한다.
주의!!!) [ ] 은 그 사이사이를 반드시 공백으로 띄어야한다.
[ ]을 제어문자가 아닌 하나의 명령어로 이해할 것!!!
- test는 크게 다음과 같은 3가지를 판별한다.
1)스트링
2)산술식(Interger)
3)파일
- test는 다음과 같은 이진연산자를 인자로 갖는다.
!A A가 아니면 true
A -a B(&&) A이고 B이면 true
A -o B(||) A이거나 B이면 true
-- string 비교시 쓰이는 연산자
A == B A와 B가 같으면 true
A != B A와 B가 다르면 true
-n A A가 not null이면 true
-z A A가 null이면 true
-- integer only 연산자
A -eq B A==B
A -ne B A!=B
A -ge B A>=B
A -gt B A>B
A -le B A<=B
A -lt B A<B
*** =,>,<,!등을 써도되나 주로 스트링비교연산자로 쓰이므로
산술비교 시는 되도록 전자의 표기법을 따라라.
-- file only 연산자
A -ef B 동일파일
A -nt B A가 최신파일(newer modification data)
A -ot B A가 오래된파일(older ..)
-e A 파일이 있다
-s A 파일크기가 0이 아님(내용있음)
-d A directory임
-f A file임
-h(or L) A Symbolic Link
-r A 현재 사용자가 r권한 갖고 있음.
-w A .. .. .. w .. .. ..
-x A .. .. .. x .. .. ..
-O A 내가 소유자임
-G A Group이 같음
-N A (내가) 마지막으로 읽은 후에 변경
--------여기까지만...밑에는 잘 모르겠다-------------
-S A Scoket
-p A PIPE
-b A block device(플로피,씨디롬 등 마운트객체)
-c A character special(키보드,모뎀,사운드카드등 장치)
-g A set-group-id(sgid) flag가 설정된 파일
-u A set-user-id(suid) flag가 설정된 파일
-k A has its stick bit set
-t A file descriptor가 terminal device와 관계됨.
사용법
b=히히히
if [ $a!=$b ]; then # [ ] 사이 공백이 있어야함에 주의!
# then을 이어서 쓸 때 앞명령과 ;로 구분함에 주의!
echo "a is not b"
else
echo "a is b"
fi
c= # 이렇게 하면 변수c는 null값을 가진다.
if [ -z $c ]; then echo "c is null"; fi
a=3
b=10
if [ $a -gt $b ]; then
echo "a is greater then b"
else
echo "a is less then b";
fi
touch 빈파일
if [ -e "빈파일" ];then echo "file is exist!"; fi
if [ -s "빈파일" ];then echo "file size is zero"; fi
case문
값1 ) 처리1;;
값2 ) 처리2;;
값3 ) 처리3;;
...
* ) default처리;;
esac
ex)
case $( arch ) in
i386 ) echo 80386;; #;; 두번들어감에 유의!!!
i486 ) echo 80486;;
i586 ) echo pentium;;
i686 ) echo pentium3;;
* ) echo "몰라! 이상한 머신이야..."
esac
while문
...
done
ex)
i=0
while [ $i -lt 10 ];do
echo $i
i=$((i+1))
sleep 0.2
done
for문
echo $i
sleep 0.2
done
커맨드라인(사용자) 입력받기
쉘스크립트파일안에서 쉘명령 실행
ex) eval "ls -al"
문자열 제어
ex)
a=aaa하하핳BBBaaaccc
1. 문자열 길이
echo ${#a} --> 15
2. substring
echo ${a:3} --> aaa
echo ${a:3:6} --> 하하하BBB : position,length
3. replace
echo ${a//aaa/} --> 하하핳BBBccc
echo ${a/aaa/AAA} --> AAA하하핳BBBaaaccc
파일명 비우기
쉘에서 :은 null을 의미한다. 고로 : > [파일]은 null값을 파일에 redirection하므로 해당 파일의 크기가 0이 된다.
Tip
변수에 substring 사용하기
var=${변수명:start index:end index}
DT=`date -d +"%Y%m%d %H:%M:%S`
STR="Hello World"
month=${DT:0:5}
str2=${STR:0:4}
echo $month
echo $str2
date 함수
현재의 날짜와 시간을 가져옴
date +%Y%m%d -> 20101216
date +%y%m%d -> 101216
등등 %Y%m%d를 변경해 가면서 사용할 수 있음
##하루전 날짜 구하기
date +%Y%m%d -d '-1days'
or
date +%Y%m%d --date '1 days ago'
-- 연간 주간은 알아서 찾아 보길
##shell에서 사용시
$(date +"%Y%m%d")
##날자의 파일명 만들기
filename=exe_$(date +" %Y%m%d")
##date 함수 Shell에서 사용할 때
filename=exe_$(date +"%Y%m%d") //오늘 날짜
filename=exe_$(date +"%Y%m%d" -d '-1days') //전날짜
예제파일
sh1.shsh2.shsh3.shshex.sh
'DEVELOPMENT > Linux' 카테고리의 다른 글
linux 명령어 - yum (0) | 2012.05.17 |
---|---|
linux 명령어 - crontab (0) | 2012.05.17 |
Fedora 16 | systemctl - 서비스 관리 명령어 (0) | 2011.12.01 |
linux mysql 바이너리 버전 설치 (0) | 2011.11.29 |
ssh 접속 설정. (0) | 2011.11.29 |