쉘 스크립트를 작성하려는 프로그래머를 위한 bash 프로그래밍 요약이다. 이 글의 목적은 프로그래밍을 가르치는 데에 있지 않다. 이미 하나의 프로그래밍 언어를 알고 있으면서 bash 스크립팅을 배우려고 하는 사람들을 위한 것이다.
프로그래밍의 기초
모든 bash 스크립트는 반드시 o/s에게 인터프리터로 무엇을 쓸 것이지 알려야 한다. 모든 스크립트의 첫번째 라인은 다음과 같아야 한다:
#!/bin/bash
다음 명령으로bash 스크립트를 실행 가능하게 만들어야 한다.
chmod +x filename
변수
변수를 만들어 값을 대입한다. 변수에는 데이터 타입이 없다(다른 언어에서처럼 변수의 타입을 정의하지 않고도 변수의 값으로 문자열, 숫자 등을 가진다).
varname=value
변수 값에 접근할 때는 변수 이름 앞에 $를 붙인다
echo $varname
명령 라인에서 인자로서 넘겨진 값은 $#를 통해 접근할 수 있다. 여기서 #는 넘겨진 값들의 배열 중 그 값의 인덱스이다. 이 배열은 1부터 시작한다.
command var1 var2 var3 .... varX
$1은 var1이 무엇이든지 그 값을 나타내며, $2는 var2의 값을 나타낸다. 나머지도 마찬가지이다.
내부에 정의된 변수들:
변수 |
용도 |
$1-$N |
명령 라인으로부터 쉘 프로그램에 넘겨진 인자(변수)를 저장한다. |
$? |
마지막 명령이 실행되었을 때의 탈출 값을 저장한다. |
$0 |
입력된 명령의 첫번째 단어(쉘 프로그램의 이름)를 저장한다. |
$* |
명령 라인에서 입력된 모든 인자들(($1 $2 …)을 저장한다. |
"$@" |
명령 라인에서 입력된 모든 인자들을 개별적으로 따옴표를 씌운 형태("$1" "$2" ...)로 저장한다. |
인용 부호
보통의 따옴표("like these")는 쉘이 공백 문자를 무시하도록 해서 넘겨진 하나의 인자 또는 사용할 문자열로 생각하게 한다. 하지만 따옴표 안의 특수 문자는 인식한다.
작은 따옴표('like this')는 어떤 문자열이 넘겨지든 간에 쉘이 모든 특수 문자를 무시해서 해석하도록 한다.
역 따옴표(`command`)는 다른 기능을 한다. 한 명령의 결과를 다른 명령에서 사용하고 싶을 때 역 따옴표를 사용한다. 예를 들어, 변수 contents 의 값을 현재 디렉토리 안에 있는 파일의 리스트와 같게 하고 싶다면 다음과 같은 명령을 입력하면 된다: contents=`ls`. ls 프로그램의 결과가 변수 contents에 들어 간다.
논리와 비교
루프에의 입장/탈출 조건을 체크하는 if-then 문장과 같은 조건 연산식의 계산에는 test라 불리는 명령이 사용된다.
test expression
또는
[ expression ]
수치 비교 | ||
int1 -eq int2 |
int1이 int2와 같다면 True를 리턴한다. | |
int1 -ge int2 |
int1이 int2보다 크거나 같으면 True를 리턴한다. | |
int1 -gt int2 |
int1이 int2보다 크면 True를 리턴한다. | |
int1 -le int2 |
int1이 int2보다 작거나 같으면 True를 리턴한다. | |
int1 -lt int2 |
int1이 int2보다 작으면 True를 리턴한다. | |
int1 -ne int2 |
int1이 int2과 다르면 True를 리턴한다. |
문자열 비교 | ||
str1 = str2 |
str1과 str2가 일치하면 True를 리턴한다. | |
str1 != str2 |
str1과 str2가 다르면 True를 리턴한다. | |
str |
str이 null이 아니면 True를 리턴한다. | |
-n str |
str의 길이가 0보다 크면 True를 리턴한다. | |
-z str |
str의 길이가 0과 같으면 True를 리턴한다.(길이가 0인 것은 null과 다르다) |
파일 비교 | ||
-d filename |
파일 filename이 디렉토리면 True를 리턴한다. | |
-f filename |
파일 filename이 일반적인 파일이면 True를 리턴한다. | |
-r filename |
파일 filename이 프로세스에 의해 읽혀진다면 True를 리턴한다. | |
-s filename |
파일 filename의 길이가 0이 아니면 True를 리턴한다. | |
-w filename |
파일 filename이 프로세스에 의해 쓰여질 수 있다면 True를 리턴한다. | |
-x filename |
파일 filename이 수행 가능하다면 True를 리턴한다. |
표현식 비교 | ||
!expression |
expression이 true가 아니면 true를 리턴한다. | |
expr1 -a expr2 |
expr1과 expr2가 true이면 true를 리턴한다. ( && , and ) | |
expr1 -o expr2 |
expr1이나 expr2 중 적어도 하나가 true이면 true를 리턴한다. ( ||, or ) |
논리(이어서)
If...then
if [ expression ]
then
commands
fi
If..then...else
if [ expression ]
then
commands
else
commands
fi
If..then...else If...else
if [ expression ]
then
commands
elif [ expression2 ]
then
commands
else
commands
fi
Case select
case string1 in
str1)
commands;;
str2)
commands;;
*)
commands;;
esac
string1은str1, str2와 비교된다. 만일 이 중 하나가 string1과 일치한다면, 이중 세미콜론이 나올 때까지 commands가 실행된다. 만일 어느 것도 string1과 일치하지 않는다면, *에 해당하는 commands가 실행된다. 이것은 디폴트 경우로, *가 모든 문자열에 해당하기 때문이다.
반복(루프, loop)
for var1 in list
do
commands
done
이것은 list 안의 각 항목에 대해 한번씩 실행된다. 이 list는 공백 문자로 구분된 여러 개의 단어를 담고 있는 변수(ls나 cat 명령의 출력과 같은)일 수 있다. 또는 문장에 직접 입력된 값들의 리스트일 수도 있다. 루프를 돌 때마다, 변수 var1에는 리스트의 항목 중 현재 항목이 대입되는데 마지막 항목에 이를 때까지 계속 반복된다.
while [ expression ]
do
commands
done
until [ expression ]
do
commands
done
함수
함수 만드는 법:
fname(){
commands
}
함수를 부를 땐 다음의 문법을 사용한다: fname
인자를 받아들이는 함수 만들기:
fname2 (arg1,arg2...argN){
commands
}
인자 있는 함수 부르는 법: fname2 arg1 arg2 ... argN
오늘은 계속 퍼오기만...
출처: http://coffeenix.net/doc/shell/bash_cheat.htm
원문: http://www.linuxnewbie.org/nhf/intel/programming/bash_cheat.html