매주 스터디 내용을 올리려고 했는데.. 한번씩 정리하는게 은근 빡세네요.. _-;
어찌됐든.. 5주차에는 배시쉘 문법 정리를 하면서, 예제 스크립트들을 각자 작성해 보는 시간을 가졌습니다.
> Bash Shell
- 배시쉘 문법은 기본적으로 본쉘 문법에서 확장된 형태입니다. 본쉘에서 지원하지 않는 여러 추가 문법 요소가 있습니다.
원래는 이번주에 기존 본쉘로 작성했던 스크립트를 배시쉘로 변환하는 작업을 하려고 했는데,
기본 문법이 동일하다 보니 큰 의미가 없을 것 같아서 해당 과정은 건너뛰고, 배시쉘 문법에 대해서 쭉 정리를 하고
간단한 예제를 작성해 보았습니다.
1. Bash Shell 문법 정리
- 스크립트의 첫 라인은 #!/bin/bash 로 시작한다.
- # 으로 해당 라인을 주석처리 한다.
- 입력은 read 키워드로 받을 수 있다.
- 산술연산 :
declare -i 변수명 (변수는 0으로 초기화 됨)
ex) declare -i num num=10+10 # 빈칸 허용 안됨 num="5 * 5" # 빈칸을 사용 시 큰따옴표로 묶어야 함 |
- 진수 표기법 : 변수명=진수#숫자
ex) x=2#011 echo $x 3 |
- let : 정수형 산술 연산을 수행하고 숫자 표현식을 테스트 한다.
ex) i=10 let i=i+10 echo $i 20
let "i+=5" echo $i 25
i=+5 # i = i + 5 와 동일 i=*5 # i = i * 5 와 동일 i=/5 # i = i / 5 와 동일 i=%5 # i = i % 5 와 동일 |
- 실수형 : bash에서는 정수형 연산만을 지원한다. 실수 연산시에는 bc / awk를 사용한다.
ex) n=`echo "scale=2; 20 / 3" | bc` echo $n 6.66
m=`awk -v x=2.66 -v y=5.22 'BEGIN{printf "%.2f\n", x*y}'` echo $m 13.39 |
- 위치파라미터 : 명령라인 인자들을 스크립트로 전달한다.
$0 : 실행한 스크립트명
$# : 위치파라미터 전체 개수
$* : 모든 파리미터 목록
$1 ~ $9 ~ ${10} ~ : 각 위치파라미터 참조 (${10} 이상은 중괄호로 감싸야함)
- 종료상태 : 성공인 경우 0 / 실패인 경우 0이 아닌 숫자
ex) name=multi grep "$name" /etc/passwd echo $? #마지막 실행 명령의 종료상태 확인 0 # 0이므로 해당 문자열 찾음
name=centos grep "$name" /etc/passwd echo $? 1 # 0이 아니므로 해당 문자열 찾지 못함 |
- [ ] : 표현식을 판단하기 위해 사용한다.
ex) x=10 y=20 [ $x -gt $y ] echo $? 1 |
- exit : 프로그램을 종료 시 사용한다.
exit 숫자 (숫자는 0 ~ 255)
- null 값 체크 방법 :
name=$1
if [ "$name" == "" ] # [ ! "$name" ] 또는 [ -z "$name" ]
- if
if 조건 then 명령 fi
if 조건 then 명령 elif 조건 then 명령 else 명령 fi |
- case
case 변수 in value1) 명령 ;; value2) 명령 ;; *) 명령 ;; esac |
- for
for 변수 in 단어목록 do 명령 done
ex) hi.sh #!/bin/bash for name in $* do echo $name hi done
./hi.sh linux centos script linux hi centos hi script hi |
- while
while 조건 do 명령 done |
- until
until 조건 do 명령 done |
- select
select 변수명 in 단어목록 do 명령 done
ex) run.sh #!/bin/sh
PS3="실행할 프로그램을 선택하세요. : " select program in 'ls -F' pwd date exit do $program done
./run.sh 1) ls -F 2) pwd 3) date 4) exit 실행할 프로그램을 선택하세요. : 2 /root/script 실행할 프로그램을 선택하세요. : 3 Thu Jul 23 13:55:51 KST 2009 실행할 프로그램을 선택하세요. : 4 |
- shift : 지정한 수만큼 좌측으로 파라미터 목록을 이동시킨다.
형식 : shift n (n이 생략된 경우에는 좌측으로 1회 이동
ex) shift_while.sh #!/bin/bash
while (( $# > 0 )) do echo $* shift done
./shift_while.sh 사과 배 복숭아 사과 배 복숭아 배 복숭아 복숭아
shift_date.sh #!/bin/bash
set $(date) while (( $# > 0 )) do echo $1 shift done
./shift_date.sh Thu Jul 23 14:30:54 KST 2009 |
- break : 반복문(while/for/until)을 종료 시 사용
ex) #!/bin/sh
while true do echo "리눅스를 사용해 보신 적이 있나요[y/n]? :" read answer if [[ "$answer" == [Yy] ]] then break else echo "리눅스를 사용해본 경험이 없군요." fi done echo "리눅스 사용자이시군요." |
- continue : 해당 루프의 최상위로 이동한다.
ex) #!/bin/bash
for name in $(cat mail_list) do if [[ $name == multi ]] then continue else mail $name < mail_content.txt fi done |
- 중첩 루프와 루프 관리 :
continue n : n 번째 루프의 시작으로 이동
n : 가장 안쪽 루프가 1 / 그 다음 바깥쪽 루프가 2 / ...
- 백그라운드 실행 : 끝에 & 를 붙이면 해당 스크립트를 백그라운드로 실행시킨다.
#!/bin/bash
for person in root multi linux centos do mail $person < mail.txt done & |
2. Bash Shell 예제
- 배시쉘 문법 요소 중 array를 사용한 간단한 예제를 작성해 본다.
- array를 사용하여 1부터 10까지 차례대로 출력하는 스크립트를 작성하시오.
ex1) for문 사용 #!/bin/bash array=(1 2 3 4 5 6 7 8 9 10)
array_length=${#array[*]}
for (( i = 0; i < $array_length; i++ )) do echo ${array[$i]} done
ex2) while문 사용 #!/bin/bash declare -i count count=0
while [ $array_length -gt $count ] do echo ${array[$count]} count+=1 done |
.. 이외에도 좀 더 많은 문법 요소가 있지만.. 더 자세한 내용은 앞으로 스크립트를 작성해 보면서 필요할 때마다 찾아보기로 하였습니다. ^^;
6주차에는 awk 문법 정리 및 샘플 로그 파일을 가지고 간단한 예제를 작성해 보았는데.... 곧 정리해서 올리도록 하겠습니다. ㅠ.ㅠ
그리고 한주 정도 더 정규표현식과 awk 예제를 학습하고 나서, 파이썬을 공부할 예정입니다.
관심 있으신 분은 아래 사이트를 참고하여서 미리 학습하셔도 좋을 것 같습니다.
기본 문법 위주로 정리가 잘 되어 있고, 분량도 많지 않아서 처음 파이썬을 공부하기에 적당할 것 같습니다.
'UNIX&LINUX > 쉘스크립트' 카테고리의 다른 글
Class file : createNewFile (0) | 2014.06.05 |
---|---|
쉘스크립트 참조 블로그 (0) | 2014.05.16 |
BASH 쉘스크립트 기초 - 변수 & 연산 (0) | 2014.05.13 |
쉘 스크립트 레드마인 (0) | 2014.05.13 |
[OS][LINUX][SHELL]쉘 스크립트 (0) | 2014.05.13 |
[OS][LINUX][SHELL] 쉘 개요 (0) | 2014.05.13 |
[쉘스크립트 스터디] 4주차 정리 (0) | 2014.05.13 |
[쉘스크립트 스터디] 1-3주차 정리 (0) | 2014.05.13 |