1. bash 쉘의 특징
- Alias 기능 (명령어 단축 기능) ==> alias <별명>='원래 명령어'
- History 기능 (이전 명령어 보기) ==> history 명령어 또는 위/아래 화살표
- 연산 기능
- Job Control 기능
- 자동 이름 완성 기능 ==> Tab 키
- 프롬프트 제어 기능
- 명령 편집 기능
- 환경 변수
- 환경변수 확인 ==> echo $환경변수이름
- 환경변수 설정 ==> export 환경변수이름=값
- echo $PATH : 명령어가 실행되는 경로 (해당 경로 내의 명령어가 기본 명령어)
2. 쉘 스크립트 실행 방법
- 쉘 스크립트 프로그래밍은 별도로 컴파일하지 않고 텍스트 파일 형태로 바로 실행된다.
- 리눅스의 많은 부분이 쉘 스크립트로 작성되어 있다. (C언어와 유사)
- 쉘 스크립트 파일의 확장명 : .sh
- 쉘 스크립트 파일을 /usr/local/bin/ 디렉토리에 복사하고, 속성을 755로 변경해주면 모든 사용자가 스크립트를 사용할 수 있다. (이 작업은 보안상 root만 수행함)
- 쉘 스크립트 실행하는 두 가지 방법
- sh <스크립트 파일>
- chmod +x <스크립트 파일> && ./<스크립트파일>
ex) name.sh
-------------------------------------------------------------------------
#! /bin/sh --> bin 아래 쉘을 사용한다는 의미로 반드시 써주어야 한다.
echo "사용자이름: " $USERNAME
echo "호스트이름: " $HOSTNAME
exit 0
-------------------------------------------------------------------------
~$ sh name.sh
~$ chmod +x name.sh
~$ ./name.sh - 현재 디렉토리임을 명시해야 한다. 환경변수에 디렉토리경로가 없으므로 name.sh 만 입력할 경우 명령어 탐색 실패라고 뜬다.
3. 쉘 스크립트 - 변수
- 변수를 사용하기 전에 미리 선언하지 않으며, 변수에 처음 값이 할당되면서 자동으로 변수가 생성된다.
- 모든 변수는 문자열(String)로 취급
- 변수 이름은 대소문자를 구분
- 변수를 대입할 때 '=' 좌우에는 공백이 없어야 한다.
- 터미널에서 바로 입력 가능
- 생성된 변수를 사용할 때는 항상 $를 앞에 붙인다.
~$ valName=Hello
~$ echo $valName
~$ valName="Yes Sir" # 공백이 있으면 큰따옴표로 묶어줘야함
~$ echo $valName - 변수의 입력과 출력 : $ 문자가 들어간 글자를 출력하려면 ' ' 또는 " "로 내용물을 묶어서 대입하거나 앞에 역슬래쉬(\)를 붙인다.
ex) var1.sh
--------------------------------------------------------------------------
#! /bin/sh
myvar="Hi Woo"
echo $myvar
echo "\$myvar" # 출력내용은 $myvar 이다.
echo '\$myvar'
echo \$myvar
echo "값 입력: "
read myvar # 터미널에서 입력한 내용을 변수에 저장
echo \$myvar = $myvar # 문자열과 변수의 내용을 합한 것.
exit 0
--------------------------------------------------------------------------
~$ sh var1.sh - 변수에 들어 있는 값을 숫자로 해서 사칙 연산등을 하려면 expr 을 사용
- 수식에 괄호 또는 곱하기(*)는 그 앞에 반드시 역슬래쉬(\)를 붙여야 한다.
ex) var2.sh
-------------------------------------------------------------------------
#! /bin/sh
num1=100
num2=$num1+200
echo $num2 # 문자열("100+200")로 출력된다.
num3='expr $num1 + 200'
echo $num3
num4='expr \($num1 + 200 \)/10 \* 2'
echo $num4
exit 0
-------------------------------------------------------------------------
~$ sh var2.sh - 파라미터 변수는 $0, $1, $2 ... 의 형태를 가진다.
- 전체 파라미터는 $*로 표현
- yum -y install gftp
$0 $1 $2 $3
ex) paravar.sh
-------------------------------------------------------------------------
#! /bin/sh
echo "실행파일 이름은 <$0>이다."
echo "첫번째 파라미터는 <$1>이고, 두번째 파라미터는 <$2>다."
echo "전체 파라미터는 <$*>다."
exit 0
-------------------------------------------------------------------------
~$ sh paravar.sh 값1 값2 값3
$0 $1 $2 $3
4. 쉘 스크립트 - 조건문
- 기본 if문
if [ 조건 ]
then
참일 경우 실행
fi
ex) if1.sh
-------------------------------------------------------------------------
#! /bin/sh
if [ "woo" = "woo" ]
then
echo "참입니다."
fi
if [ "woo" != "woo" ]
then
echo "참입니다."
else
echo "거짓입니다."
fi
exit 0
-------------------------------------------------------------------------
~$ sh if1.sh - 조건문에 들어가는 비교 연산자
- -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이 작거나 같으면 참
- !수식 : 수식이 거짓이면 참
- 파일과 관련된 조건
- -d 파일이름 : 디렉토리이면 참
- -e 파일이름 : 파일 존재하면 참
- -f 파일이름 : 일반파일이면 참
- -g 파일이름 : 파일에 set-group-id가 설정되면 참
- -r 파일이름 : 파일이 읽기 가능이면 참
- -s 파일이름 : 크기가 0이 아니면 참
- -u 파일이름 : 파일에 set-user-id가 설정되면 참
- -w 파일이름 : 파일이 쓰기 가능 상태이면 참
- -x 파일이름 : 파일이 실행 가능 상태이면 참
ex) if2.sh
-------------------------------------------------------------------------
#! /bin/sh
fname=/lib/systemd/system/httpd.service
if [ -f $fname ]
then
head -5 $fname
else
echo "웹 서버가 설치되지 않았습니다."
fi
exit 0
-------------------------------------------------------------------------
~$ sh if2.sh
또는
~$ chmod +x if2.sh
~$ ./if2.sh
- case~esac 문 : 여러 가지 경우의 수가 있다면 case문 (다중분기), if문은 2중분기
ex) case1.sh
--------------------------------------------------------------------------
#! /bin/sh
case "$1" in
start)
echo "시작~~";;
stop)
echo "중지~~";;
restart)
echo "다시 시작~~";;
*)
echo "뭔지 모름~~";;
esac
exit 0
--------------------------------------------------------------------------
~$ sh case1.sh stop
ex) case2.sh
--------------------------------------------------------------------------
#! /bin/sh
echo "리눅스가 재미있나요? (yes/no)"
read answer # 사용자 입력값 받아오기
case $answer in
yes | y | Y | Yes | YES)
echo "다행입니다."
echo "더욱 열심히 하세요 ^^";;
[nN]*)
echo "안타깝네요. ㅠㅠ";;
*)
echo "yes 아니면 no만 입력했어야죠"
exit 1;;
esac
exit 0
--------------------------------------------------------------------------
~$ sh case2.sh - 관계 연산자
- and는 -a 또는 && 를 사용
- or는 -o 또는 || 를 사용
ex) and_or.sh
--------------------------------------------------------------------------
#! /bin/sh
echo "보고 싶은 파일명을 입력하세요."
read fname
if [ -f $fname ] && [ -s $fname ] ; then
head -5 $fname
else
echo "파일이 없거나 크기가 0입니다."
fi
exit 0
--------------------------------------------------------------------------
~$ sh and_or.sh
5. 쉘 스크립트 - 반복문
- for 문
for 변수 in 값1 값2 값3 ...
do
반복할 문장
done
ex) for1.sh
--------------------------------------------------------------------------
#! /bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10 # 또는 for i in 'seq 1 10'
do
hap='exp $hap + $i'
done
echo "1부터 10까지의 합: "$hap
exit 0
--------------------------------------------------------------------------
~$ sh for1.sh
ex) for2.sh
--------------------------------------------------------------------------
#! /bin/sh
for fname in $(ls *.sh) # 해당 명령어의 결과로 나온 파일명을 변수에 대입
do
echo "--------$fname---------"
head -3 $fname
done
exit 0
--------------------------------------------------------------------------
~$ sh for2.sh - while 문
ex) while1.sh
--------------------------------------------------------------------------
#! /bin/sh
while [ 1 ] # 또는 while [ : ]
do
echo "CentOS 7"
done
exit 0
--------------------------------------------------------------------------
ex) while2.sh
--------------------------------------------------------------------------
#! /bin/sh
hap=0
i=1
while [ $i -le 10 ] # 또는 until [ $i -gt 10 ] : 거짓인동안 계속 반복함.
do
hap='expr $hap + $i'
i='expr $i + 1'
done
echo "1부터 10까지의 합:"$hap
exit 0
--------------------------------------------------------------------------
~$ sh while2.sh
ex) while3.sh
--------------------------------------------------------------------------
#! /bin/sh
echo "비밀번호를 입력하세요."
read mypass
while [ $mypass != "1234" ]
do
echo "틀렸음. 다시 입력하세요."
read mypass
done
echo "통과~~"
exit 0
--------------------------------------------------------------------------
~$ sh while3.sh
6. 쉘 스크립트 - 종료문
ex) break_continue_exit.sh
--------------------------------------------------------------------------
#! /bin/sh
echo "무한 반복 입력을 시작합니다.(b: break, c: continue, e: exit)"
while [ 1 ]; do
read input
case $input in
b | B)
break ;;
c | C)
echo "continue"를 누르면 while의 조건으로 돌아감"
continue ;;
e | E)
echo "exit를 누르면 프로그램을 완전히 종료함"
exit 1 ;;
esac;
done
echo "break를 누르면 while을 빠져나와 지금 이 문장이 출력됨."
exit 0
--------------------------------------------------------------------------
~$ sh break_continue_exit.sh
7. 쉘 스크립트 - 사용자 정의 함수
- 함수 기본구조
FuncName () {
# body
}
FuncName
ex) func1.sh
--------------------------------------------------------------------------
#! /bin/sh
myFunction () {
echo "함수 안으로 들어왔음"
return # 함수 내에서만 사용되는 종료문으로 함수가 호출된 시점으로 돌아감
}
echo "프로그램을 시작합니다."
myFunction
echo "프로그램을 종료합니다."
exit 0
--------------------------------------------------------------------------
~$ sh func1.sh - 함수의 파라미터 사용
FuncName () {
# $1, $2, ... 등을 사용
}
FuncName $param1 $param2
ex) func2.sh
--------------------------------------------------------------------------
#! /bin/sh
hap () {
echo 'expr $1 + $2'
}
echo "10 더하기 20을 실행합니다."
hap 10 20
exit 0
--------------------------------------------------------------------------
~$ sh func2.sh
8. 쉘 스크립트 - 내장 함수
- eval : 문자열 자체를 명령문으로 인식하고 실행하기
ex) eval.sh
--------------------------------------------------------------------------
#! /bin/sh
str="ls -l anaconda-ks.cfg"
echo $str
eval $str
exit 0
--------------------------------------------------------------------------
~$ sh eval.sh - export : 외부 변수로 선언해 준다. 즉, 선언한 변수를 다른 프로그램에서도 사용할 수 있도록
해준다.
ex) exp1.sh
--------------------------------------------------------------------------
#! /bin/sh
echo $var1
echo $var2
exit 0
--------------------------------------------------------------------------
ex) exp2.sh
--------------------------------------------------------------------------
#! /bin/sh
var1="지역 변수"
export var2="외부 변수"
sh exp1.sh # exp1.sh 를 실행하는데 외부변수로 var2를 exp1.sh 에서 인식
exit 0
--------------------------------------------------------------------------
~$ sh exp2.sh - printf : 형식을 지정해서 출력
ex) printf.sh
--------------------------------------------------------------------------
#! /bin/sh
var1=100.5
var2="재미있는 리눅스~~"
printf "%5.2f \n\n \t %s \n" $var1 "$var2"
exit
--------------------------------------------------------------------------
~$ sh printf.sh - set $(명령어)
- 리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용
- 결과를 파라미터로 사용하고자 할 때는 set과 함께 사용
ex) set.sh
--------------------------------------------------------------------------
#! /bin/sh
echo "오늘 날짜는 $(date) 입니다." # date 명령어 실행
set $(date)
echo "오늘은 $4 요일 입니다." # 결과를 파라미터로 받음
exit 0
--------------------------------------------------------------------------
~$ sh set.sh
- shift
- 파라미터 변수를 왼쪽으로 한 단계씩 아래로 쉬프트 시킴
- 10개가 넘는 파라미터 변수에 접근할 때 사용한다
- 단, $0 파라미터 변수는 변경되지 않음
- $10 은 $1뒤에 0이붙은 결과를 내보냄
ex) shift1.sh
--------------------------------------------------------------------------
#! /bin/sh
myfunc() {
str=""
while [ "$1" != "" ]; do
str="$str $1" # 이전의 파라미터들 값과 바뀌는 $1값이 합쳐짐.
shift # $1이 계속해서 $2가 되고, $3이 되고, ... $10이 된다.
done
echo $str
}
myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
exit 0
--------------------------------------------------------------------------
'Programming Language > etc' 카테고리의 다른 글
Asynchronous vs Synchronous Or Blocking vs Non-Blocking - 동기/비동기, 블로킹/논블로킹 (0) | 2017.03.24 |
---|---|
Double Buffering - 더블 버퍼링 기법 (0) | 2017.03.22 |