Linux/Unix2009. 8. 11. 17:29

쉘 스크립트를 작성하려는 프로그래머를 위한 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
Posted by 샤키