shell programming - (1) 기본 문법
* 인용 부호
" " // 특수 문자 및 변수를 사용
' ' // 입력된 모든 문자를 일반 문자로 사용함(변수명일지라도 무시)
\ // 바로 뒤의 특수문자를 문자로 변환
`` // 해당 문자열을 명령어로 먼저 처리함
* 배열
변수명=(값1 값2 값3)
ex)
# test=(1 2 3 4)
# echo ${test[0]}
1
# echo ${test[3]}
4
# echo ${test[*]}
1 2 3 4
* echo 사용법
-n // 개행문자 사용안함. 입력값 받을때 주로 사용함
(ex) echo -n "문자열 입력하세요 : ";read ANS;echo $ANS;
-e // 특수문자 인식하도록 함
특수문자
\t // tab 만큼 띄어쓰기(8칸)
\a // 경고음
\r // carriage return (커서를 가장 앞으로 이동)
\v // vertical tab (수직탭, -n 이 아닌 )
\n // \v+\r (enter 와 동일)
* sort 사용법
-r // 내림차순, 기본은 오름차순
-t // 필드 구분자
-k // 정렬 기준 필드 선택
-n // 해당 기준 필드를 숫자로 인식. 안해주면 77 과 8을 비교해도 77이 앞으로 정렬됨
ex) uid 를 기준으로 오름차순 정렬
# sort -t : -k 3 -g /etc/passwd
결과)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
(생략)
* 산술 비교 연산자
A -eq B // A 는 B와 값이 같다.
A -ne B // A 와 B의 값이 다르다.
A -gt B // A 는 B보다 크다.(greater than)
A -lt B // A 는 B보다 작다.(less than)
A -ge B // A 는 B보다 크거나 같다.
A -le B // A 는 B보다 작거나 같다.
(ex) num=4;if [ $num -ne 5 ];then 5가 아니잖아!!;fi
*문자열 비교 연산자
-z stringA // 문자열의 길이가 0인 경우
-n stringA // 문자열의 길이가 0이 아닌경우
stringA = stringB // 문자열이 동일
stringA != stringB // 문자열이 다름
string // 문자열값이 있는경우(변수가 null 값인지 확인용도)
* 파일 검사 연산자
-f // 파일이 존재하며 정규파일인 경우
-a // 파일이 존재할 경우
-b // 파일이 존재하며 block device 일 경우
-c // 파일이 존재하며 character device 일 경우
-d // 파일이 존재하며 directory 인 경우
-u // 파일이 존재하며 SetUID가 설정된 경우
-g // 파일이 존재하며 SetGID가 설정된 경우
-k // 파일이 존재하며 Sticky 비트가 설정된 경우
-r // 파일이 존재하며 읽기 가능할 경우
-s // 파일이 존재하며 크기가 0보다 클 경우
-h // 파일이 존재하며 한개 이상의 심볼릭링크가 설정되어 있을 경우
-w // 파일이 존재하며 쓰기가 가능한 경우
-x // 파일이 존재하며 실행가능한 경우
(ex) if [ -w /etc/passwd ];then
echo "passwd에 쓰기 가능하네요~"
fi
* 여러 조건 동시에 사용
if [ 조건식1 -a 조건식2 ] // 둘다 만족
if [ 조건식1 -o 조건식2 ] // 하나라도 만족
if [ \( 조건식1 -a 조건식2 \) -o \( 조건식3 -a 조건식4 \) ] // 1+2 혹은 3+4를 만족
(ex) if [ -f /etc/passwd -a -r /etc/passwd -a -w /etc/passwd ];then
echo "passwd file edit enable"
fi
* 조건문 - if
if [ 조건식 ];then
실행문
elif [ 조건식 ];then // 생략가능
실행문
else // 생략가능
실행문
fi // 종료를 알리는 것이므로 꼭 써주어야함
* 조건문 - case
case 변수 in
패턴1) 실행문
;;
패턴2) 실행문
;;
*) 실행문 // 패턴을 제외한 나머지 경우
;;
* 반복문
1. for
for 변수명 in 리스트 // 리스트는 공백으로 구분, for 변수명 in $(ls) 등으로 리스트를 받는것도 가능함
do
$변수명,명령들
done
2. while
while [ 조건식 ]
do
명령들
done
** 스크립트내부에서 산술연산시 (( )) 사용함
(ex) while 예제
num=0
while [ $num -lt 5 ]
do
echo "num : $num"
num=$((num+1))
done
(ex2) for 예제
for((num=0;num<=9;num++))
do
echo "num : $num"
done
*awk 문법
-F 구분인자 지정
-f 스크립트 지정
-v 변수 지정
(ex) 기본 사용예제
awk /^root/'{print}' /etc/passwd // root 로 시작하는 행 출력
awk /^root/'{print $1,$2}' // root 로 시작하는 행에서 1,2번째 필드 출력
awk /^root/'{print $1 " and " $2 }' // " " 안의 내용은 그대로 출력됨
(ex2) ip주소 출력
# ifconfig | sed -n '2s/addr/IPADDR/gp' | awk '{print "ETH0 " $2}'
결과)ETH0 IPADDR:192.168.150.4
* 시작과 마지막 실행문 추가
awk 'BEGIN { }
{ }
END { }' <filename>
(ex3) uid가 500이상인 유저명 출력
# awk -F: 'BEGIN {print "USER\n======"} $3 >=500 {print ++cnt,$1} END {print "======\n" cnt " count"}' /etc/passwd
결과)
USER
=======
1 nfsnobody
2 hyunmini
3 mysql
=======
3 count
* 문자열 연산자
${변수명:-변수값} // 변수가 존재하면 해당 값 반환, 값이 없거나 NULL 이면 변수값으로 새로 할당함
${변수명:위치값} // 위치값부터 마지막까지 출력
${변수명:위치값:문자열길이} // 지정한 위치부터 지정길이만큼 출력
ex)
# TEST="http://cafe.naver.com/secuholic"
# echo ${TEST:7}
cafe.naver.com/secuholic
# echo ${TEST:22:9}
secuholic
* 함수
function()
{
실행문
}
* 함수 실행
function
** 함수에 매개변수 전달 // 함수는 독자적인 인자를 가진다.
function a,b,c // 내부에서 $1 은 a, $2는 b, $3은 c 가 된다.
function $* // 셸상에서 입력받았던 인자를 함수의 인자로 전달함
** 셸에서 사용되는 특별 변수
$$ // 현재 실행중인 프로세스의 PID
$? // 마지막에 실행한 명령어의 종료값(에러,정상 종료 등)
$! // 마지막 자식 프로세스의 PID
$# // 인자의 총 갯수
$0 // 명령어를 저장. 위치 매개변수라고 함
$1,$2,... // 인자들을 저장함. 함수의 경우 함수별로 독립적임
$* // 명령에 전달된 인수 전체를 한개의 문자열로 처리
$@ // 명령에 전달된 인수를 목록으로 각각의 문자열로 처리
[출처] shell programming|작성자 hyunmini
'linux' 카테고리의 다른 글
yum url 에 DVD 추가 (0) | 2016.12.14 |
---|---|
bash if 비교연산자 (0) | 2016.06.27 |
boson (0) | 2007.03.16 |
iptables - 추가 (0) | 2007.03.16 |
/proc/sys/net/ipv4/* 을 위한 문서 (0) | 2007.03.16 |