linux shell 스크립트
개발/Linux2012. 1. 13. 12:01
파일구조
#!/bin/bash
#내용
exit 0
문서의 시작은 #!bin/bash로 시작하며 문서의 끝은 exit 0으로 끝낸다.#내용
exit 0
변수선언
a=0 (O)
a = 0 (X)
b="aaaa bbbb"
a = 0 (X)
b="aaaa bbbb"
변수사용
$a
$b
echo $a
$(($a + 10))
$b
echo $a
$(($a + 10))
인자값(argument)
$# : 넘어온 인자의 갯수
$* : 각 인자를 나누지 않고 통틀어 참조
$@ : $*와 같지만 quoting(escape)된 문자열로 취급
$0 : 실행된 쉘스크립트 이름
$1, $2, ... 쉘, 함수 호출시 넘어온 매개변수
$* : 각 인자를 나누지 않고 통틀어 참조
$@ : $*와 같지만 quoting(escape)된 문자열로 취급
$0 : 실행된 쉘스크립트 이름
$1, $2, ... 쉘, 함수 호출시 넘어온 매개변수
if문
if [표현식]; then
...
fi
if [표현식]; then
...
elif [표현식]; then
...
else
...
fi
...
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가 아니면 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와 관계됨.
!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와 관계됨.
사용법
a=하하하
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
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문
case $변수 in
값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
값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문
while [ ... ];do
...
done
ex)
i=0
while [ $i -lt 10 ];do
echo $i
i=$((i+1))
sleep 0.2
done
...
done
ex)
i=0
while [ $i -lt 10 ];do
echo $i
i=$((i+1))
sleep 0.2
done
for문
for i in 1 2 3 4 5; do
echo $i
sleep 0.2
done
echo $i
sleep 0.2
done
커맨드라인(사용자) 입력받기
read
한줄로 입력하려면 aaaa<Enter> 여러줄로 입력받으려면 aaa\<Enter> bbbb\<Enter>쉘스크립트파일안에서 쉘명령 실행
eval
ex) eval "ls -al"
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
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
'개발 > 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 |