Bash 스크립팅 기초 - 변수, 조건문, 반복문
Bash 스크립팅 기초
Bash 스크립트는 Linux/Unix 시스템에서 자동화를 위해 필수적인 기술입니다.
기본 규칙
- 대입 연산 시
=좌우에 공백 없이 작성:VAR=text - 상수는 대문자, 변수는 소문자
- 단어 분리는
_사용
변수
변수 선언
VAR=text # 같은 쉘에서만 사용 가능
export (환경 변수)
export VAR=text # 같은 프로세스 내에서 사용 가능, 프로세스 종료 시 초기화
변수 사용
echo "$VAR"
echo "${VAR}"
mkdir ~/temp/db/$1 # 변수 연결
Command Substitution
명령 실행 결과를 변수에 저장:
$(command)
`command`
# 예시
echo $(ls)
ls -l $(which cp)
echo `ls`
Quoting
# 따옴표 안에서 변수, 계산, 명령어 사용
echo "$USER $((2+2)) $(cal)"
# Double quote - 변수/명령어 확장됨
echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
# => text ~/*.txt {a,b} foo 4 me
# Single quote - 그대로 출력
echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
# => text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
조건문
if문
# 한 줄
if true; then echo "It's true."; else echo "bb"; fi
# 여러 줄
if [ -f .bash_profile ]; then
echo "You have a .bash_profile."
elif [ "$character" = "2" ]; then
echo "You entered two."
else
echo "Yikes!"
fi
비교 연산
if [ $number = "1" ]; then
echo "Number equals 1"
fi
# 숫자와 문자 구별 안함
if [ 1 = "1" ]; then
echo "Equal"
fi
case문
case $character in
1 ) echo "You entered one."
;;
2 ) echo "You entered two."
;;
[[:lower:]] | [[:upper:]] )
echo "You typed a letter"
;;
[0-9] )
echo "You typed a digit"
;;
* ) echo "Unknown input"
esac
test 표현식
# 파일 테스트
-d file # directory
-e file # exists
-f file # regular file
# 문자열 테스트
-z string # empty (zero)
-n string # not empty
string1 = string2
string1 != string2
# 산술 비교
-eq # equal
-ne # not equal
-lt # less than
-le # less than or equal
-gt # greater than
-ge # greater than or equal
# 부정
if [ ! -d $1 ]; then
echo "Not a directory"
fi
반복문
for문
# 기본 형태
for variable in words; do
commands
done
# 예시
for i in word1 word2 word3; do
echo $i
done
# 숫자 범위
for index in 1 2 3 4 5; do
echo $index
done
# C 스타일
for (( i = 2 ; i <= 16 ; i++ )); do
cp 1.sqlite $i".sqlite"
done
# 배열 순회
for element in $(seq 0 $((${#script_contents[@]} - 1))); do
echo -n "${script_contents[$element]}"
done
while문
number=0
while [ "$number" -lt 10 ]; do
echo "Number = $number"
number=$((number + 1))
done
until문 (false일 때 계속)
number=0
until [ "$number" -ge 10 ]; do
echo "Number = $number"
number=$((number + 1))
done
산술 연산
# Arithmetic Expansion
echo $((2 + 2))
echo $(((5**2) * 3))
# let
let myvar+=1
# 배열 연산
area[5]=`expr ${area[11]} + ${area[13]}`
# 제곱
$((5**2))
# 나머지
$((5%2))
배열
# 선언
area=( zero one two three four )
# 접근
echo ${area[11]}
# 설정
area[11]=abc
area3=([17]=seventeen [24]=twenty-four)
# 길이
echo ${#area[*]}
# 전체 출력
echo ${array[*]}
echo ${array[@]}
# 범위
echo ${array[*]:1:3} # 1부터 3개
# Brace expansion
list=(Front-{a,b,c}-back) # Front-a-back Front-b-back Front-c-back
list=(Number_{1..5}) # Number_1 ... Number_5
함수
Alias
alias l='ls -l'
함수 정의
today() {
echo -n "Today's date is: "
date +"%A, %B %-d, %Y"
}
today # 함수 호출
Argument 처리
# sh a.sh a b c
# 위치 파라미터
$0 # 스크립트 경로
$1 # 첫 번째 인자 (a)
$2 # 두 번째 인자 (b)
$# # 인자 개수
# 반복 처리
while [ "$1" != "" ]; do
case $1 in
-f | --file ) shift
filename=$1
;;
-i | --interactive )
interactive=1
;;
-h | --help ) usage
exit
;;
* ) usage
exit 1
esac
shift
done
# for문 사용
for i in "$@"; do
echo $i
done
명령 결과 확인
# 마지막 명령 결과 (0이면 성공)
echo $?
ls -d /usr/bin
echo $? # 0
ls -d /bin/usr
echo $? # 2 (에러)
Shell 실행
# 새 쉘에서 실행
sh test.sh
. test.sh
# 현재 쉘에서 실행 (변수 공유)
source test.sh
Comments