Shell Script
※ 쉘 실행 b.sh
1) . ./b.sh -> login sh로 실행(bash)
2) ./test.sh -> test.sh에 명시된 sh로 실행 -> 실행권한 필요!!
3) sh test.sh ->본쉘(sh)로 실행
4) bash test.sh - >bash로 실행
5) ksh test.sh - > ksh로 실행
※ 변수의 기본
변수를 사용하기 전에 미리 선언하지 않으며, 변수에 처음 값이 할당되면서 자동으로 변수가 생성
모든 변수는 ‘문자열(String)’로 취급
변수 이름은 대소문자를 구분
변수를 대입할 때 ‘=’ 좌우에는 공백이 없어야 함
※ 변수의 입력과 출력
‘$’문자가 들어간 글자를 출력하려면 ‘’로 묶어주거나 앞에 ‘\’를 붙임
“”로 변수를 묶어줘도 된다.
(expr은 띄어쓰기 잘해야함 let은 띄어쓰기 상관없음) b.sh 참고
※ 파라미터(Parameter) 변수
파라미터 변수는 $0, $1, $2...의 형태를 가짐
전체 파라미터는 $*로 표현
예)
명령어 |
yum |
-y |
install |
gttp |
파라미터 변수 |
$0 |
$1 |
$2 |
$3 |
기본 if 문
형식
if [ 조건 ]
then
참일 경우 실행
fi
[조건에 문장이 올 때는 대괄호 x] |
※ 조건 문에 들어가는 비교 연산자
문자열비교 |
결과 |
“문자열1”=“문자열2” |
두 문자열이 같으면 참 |
“문자열1”!=“문자열2” |
두 문자열이 같지 않으면 참 |
-n "문자열“ |
문자열이 null(빈 문자열)이 아니면 참 |
-z "문자열“ |
문자열이 null(빈 문자열)이면 참 |
산술 비교 |
결과 |
수식1 -eq 수식2 |
두 수식 또는 변수가 같으면 참 |
수식1 -ne 수식2 |
두 수식 또는 변수가 같지 않으면 참 |
수식1 -gt 수식2 |
수식1이 크다면 참 |
수식1 -ge 수식2 |
수식1이 크거나 같으면 참 |
수식1 -lt 수식2 |
수식1이 작으면 참 |
수식1 -le 수식2 |
수식1이 작거나 같으면 참 |
!수식 |
수식이 거짓이라면 참 |
elif
형식
if [조건]
then
참일 경우 실행
elif [조건]
then 참일 경우 실행
else 거짓일 경우 실행
fi | |
형식
if [조건]
then
참일 경우 실행
else
if [ 조건 ]
then 참일 경우 실행
else 거짓일 경우 실행
fi
fi | |
※ 파일과 관련된 조건
파일 조건 |
결과 |
-d 파일이름 |
파일이 디렉터리면 참 |
-e 파일이름 |
파일이 존재하면 참 |
-f 파일이름 |
파일이 일반 파일이면 참 |
-g 파일이름 |
파일이 set-group-id가 설정되면 참 |
-r 파일이름 |
파일이 읽기 가능이면 참 |
-s 파일이름 |
파일 크기가 0이 아니면 참 |
-u 파일이름 |
파일에 set-user-id가 설정되면 참 |
-w 파일이름 |
파일이 쓰기 가능 상태이면 참 |
-x 파일이름 |
파일이 실행 가능 상태이면 참 |
- 만 자주 씀 알아둘 것
case~esac 문 (1)
if문은 참과 거짓의 두 경우만 사용 (2중분기)
여러 가지 경우의 수가 있다면 case문 (다중분기)
ex)
#!/bin/sh
case "$1" in
start|START|Start) &&&&& Yes|Y|Yes|YES)
echo "시작~~“;; &&&&& [nN]*) : n,N으로 시작하는 모든 문자
stop)
echo "중지~~“;;
restart)
echo "다시시작~~“;;
*)
echo "뭔지 모름~~“;;
esac
※ AND,OR 관계 연산자
and 는 ‘-a' 또는 ’&&‘를 사용
or는 ‘-o' 또는 ’||‘를 사용
ex )
#!/bin/sh
echo "보고 싶은 파일명을 입력하세요.“
read fname
if [ -f $fname && -s $fname ] <=> [ -f $fname -a -s $fname ] : 차이점 -a는 두구문에서만 사용
then
head -5 $fname
else
echo "파일이 없거나, 크기가 0입니다.“
fi
반복분 -for문 (1)
형식
for 변수 in 값1 값2 값3....
do
반복할 문장
done |
ex)
#!/bin/sh
for pal in Tom Dick Harry Joe
do
echo "Hi $pal"
done
echo "Out of File"
반복문 -for문 (2)
현재 디렉터리에 있는 셸 스크립트 파일(*.sh)의 파일명과 앞 3줄을 출력하는 프로그램
ex)
#!/bin/sh
for fname in $(ls *.sh)
do
cat $fname >>
done
반복문 -while문 (1)
조건 식이 참인 동안 계속 반복
#!/bin/sh
while [ 1 ]
do
echo "CentOS 7"
done
반복문 -while문 (2)
비밀번호를 입력받고, 비밀번호가 맞을 때 까지 계속 입력받는 스크립트
#!/bin/sh
echo "비밀번호를 입력하세요.“
read mypass
while [ $mypass != "1234 ]
do
echo "틀렸음. 다시 입력하세요.“
read mypass
done
echo "통과~~“
until 문
while 문과 용도가 거의 같지만, until문은 조건식이 참일 때 까지 (=거짓인 동안) 계속 반복한다.
위 예 4행을 until [ $mypass = "1234" ]
사용자 정의 함수
형식
함수이름 () {
-- 함수를 정의 내용들
}
|
함수이름 --함수를 호출
ex) #!/bin/sh
myFunction(){
echo "함수 안으로 들어 왔음“
returu
}
echo "프로그램을 시작합니다.“
myFunction
echo "프로그램을 종료합니다.“
함수 파라미터 사용
ex)
#!/bin/sh
hap(){
echo `expr $1 + $2`
}
echo "10더하기 20을 실행합니다“
hap 10 20
eval
문자열을 명령문으로 인식하고 실행
#!/bin/sh
str="ls -l anaconda-ks.cfg"
echo $str
eval $str
set과 $(명령어)
리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용
결과를 위치변수로 사용하고자 할 때는 set과 함께 사용
#!/bin/sh
echo "오늘 날짜는 $(date)입니다,“
set $(date)
echo "오늘은 $4 요일 입니다.“
cut 명령어
cut 명령어는 텍스트 파일 내용 중 부분을 지정하여 출력하는 명령어이다.
옵션
-b : byte, 특정 자리만 출력
-c : character(자리수)로 구분하여 출력
-d : 인자로 받은 문자열을 기준으로 필드를 구분함
-f : -d 옵션과 함께 사용되며, 구분된 필드를 출력
-b옵션 사용방법
형식 |
의미 |
예 |
N |
N자리 |
-b1 |
N,M,C |
N자리,M자리,O자리 |
-b1,3,5 |
N- |
N자리부터 마지막까지 |
-b10- |
N-M |
N자리부터 M자리까지 |
-b5-10 |
-M |
처음부터 M자리까지 |
-b-10 |
tr 명령어
표준 입력을 표준 출력으로 내보낼 때, 선택한 문자들에 대해서 치환이나 삭제를 수행함
형식
tr 'String1' 'String2' < filename |
옵션
-d : 제거
-s : 반복된 문자에 대해서 한 번 치환 (반복된 문자를 하나의 문자로 인식)
tee 명령어
명령어의 결과를 화면과 파일로 동시에 출력하는 명령어
문법
명령어 | tee [옵션] 파일명
옵션
-a : 파일에 내용 이어 쓰기
-i : interrupt 무시 |
ex)
#who | tee -a test.out
awk 명령어
자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어
문법
awk [옵션] [‘[‘/찾을문자열/’] { 명령어 }‘] 파일명 |
필드값 변수
$0 -> 모든 필드 (행의 값 그대로)
$1 -> 첫 번째 필드
$2 -> 두 번째 필드...
$(NF-1) -> 마지막 전 필드
$NF -> 마지막 필드
산술연산
echo | awk '{print 3+2}'
grep과 같이 패턴 검색 (행 단위)
cat /etc/passwd | grep apache
cat /etc/passwd | awl /apache/
awk /apache/ /etc/passwd
마지막 필드의 출력
ls -l test.out | awk '{print $NF}'
구분자의 사용
문법
awk -F 구분자 ‘{print $위치순번}’ 파일
예제
find ~ -name "*.sh"|awk -F/'{print $NF}'
grep과 cut의 결합 사용
awk -F : '/user1/{print "username is " $1}' /etc/passwd
sed 명령어
비대화형 편집기
명령 행에서 직접 편집 명령어와 파일을 지정하여 작업한 후 결과를 화면으로 확인
원본을 손상하지 않는다.
문법
sed [옵션] ‘명령어’ 파일명
옵션
n : 해당 패턴 or 실행 결과만을 출력
(기본적으로 출력되는 모든 행을 막음)
명령어
p : print 명령 사용자가 지정한 행을 출력 |
ex) '1,3p' -> 1행부터 3행까지 출력
ex) '/yang/p' -> yang이 포함된 행 출력
d : delete명령 사용자가 지정한 행을 삭제
ex) ‘3d' -> 3번째 행을 삭제
ex) '3,$d' -> 3번째 행부터 마지막까지 삭제
r : read 명령 사용자가 지정한 행을 읽어온다
ex) '3r 읽어들일파일‘ [입력할파일]
---> 입력할파일의 3번째 행에 읽어들일 파일의 내용을 읽어와 출력
a\ : append 명령 검색된 패턴 아래 행에 내용을 덧붙인다.
ex) '/패턴/a\내용‘[파일명]
--> 패턴에 일치하는 행의 다음에 내용을 삽입하여 출력
i\ : insert명령 검색된 패턴 위에 내용을 덧붙인다. a\와 사용법은 동일
s : 검색패턴을 치환함
ex) 's/string1/string2/g' 파일명
유용한 표현식
sed '10,$s/^/#/' 파일명 : 10~마지막 줄 모두 주석처리
sed '/^#/d' 파일명 : 주석처리 줄 모두 삭제
sed 's/^/ /' 파일명 : 모든 라인에 1칸 들여쓰기
sed 'a\\' 파일명 : 모든 줄마다 공백라인 추가
sed '/^$/d' 파일명 : 공백라인 제거
배열
1차원 배열에 최대 1024개의 요소를 가질 수 있다.
배열의 요소에는 단어나 정수를 지정할 수 있다
배열 첨자는 0부터 시작한다
공통 쉘 배열선언
array[0]=tom
array[1]=dan
array[2]=bill
배열 호출
# echo ${array[0]}
tom
# echo ${array[*]}
tom dan bill
# echo ${#array[*]}
3
du :
※ 이외 유용한 명령어...
sort -k -n -r 5 : 5번째 열 정렬,숫자로인식,reverse
echo $? - > 이전 명령 오류가 없을시 0값 리턴 *********************
split -l 1000 test1.txt test1_ : 라인별로 나누기
-b 100m test1.txt test1_ : 용량별로 나누기
" -d : 숫자로 구분 (파일명)
“ -d -a[n] : n자리 수로 파일명 숫자 구분
head -n : n만큼 앞에서 잘라서 출력
tail -n : n만큼 뒤에서 잘라서 출력