본문 바로가기
IT 기술/프로그래밍관련

[bash] 3rd - 흐름제어

by 땅뚱 2012. 8. 27.

## if 문


문법:

if condition

then

    statements

[elif condition

   then statements ...]

[else

    statements]

fi

condition 은 기존 프로그래밍 언어와 달리 명령의 종료상태를 나타낼 수 있다.

즉 if condition 은 if command ran successfully 로 바꿔 말 할 수 있다. condition 에 해당하는 statements 가 성공적으로 수행되면 then 이하의 statements 를 수행하고, 그렇지 않은 경우 else 문으로 넘어간다.

이러한 종료코드는 명령을 수행할 때마다 새로 세팅된다. 해당 명령의 종료코드를 알기위해서는 특수 셀 변수인 ? 를 사용한다. 즉 $? 이 이전 명령의 종료코드를 담고 있게 된다. 함수의 종료 코드는 return N 으로 특정 값을 리턴하지 않은 경우에 마지막 명령의 종료코드가 리턴된다.

종료코드는 '&&' 나 '||' 로 조합될 수 있다.

1) if statement1 && statement2 ; then ..

2) if statement1 || statement2 ; then ..

1) 구문은 statement1 이 거짓인 경우에 statement2 는 수행되지 않는다. 마찬가지로 2) 구문은 statement1 이 참인 경우 statement2 는 수행되지 않는다.

then 을 if 문과 같은 줄에서 사용하려면 bash 의 표준 구문 분리 문자인 ; 를 사용해주어야 한다.

if condition ; then ...


## 조건 검사 : [ ] 로 둘러싸서 조건 검사 수행. "[ "  " ]" 와 같이 반드시 공백으로 띄워줘야 한다.

조건 검사시 괄호로 묶고('(', ')') -a(AND) 또는 -o(OR) 로 조건을 조합할 수 있다. 괄호를 사용할 경우 '\'를 사용하여 이스케이프 처리를 해줘야 한다. '&&' '||' 와 동일하지만, -a, -o 는 조건 구문([ ]로 둘러싸인 구문) 안에서만 사용가능하다.

1. 문자열 비교

str1 = str2  문자열이 일치한다.
 str1 != str2  
 문자열이 일치하지 않는다.
 str1 < str2 
 str1 이 str2 보다 작다
 str1 > str2  str1 이 str2 보다 크다
 -n str1  str1 이 NULL 이 아니다(길이가 0보다 크다)
 -z str1  str1 이 NULL 이다.(길이가 0이다)


2. 파일속성 검사

-d file

 file 존재하고, 디렉토리인 경우

 -e file

 file 존재하는 경우

 -f file
 file 존재하고 일반 파일인 경우
 -r file
 file 존재하고 read 속성을 가지는 경우
 -s file
 file 존재하고 비어있지 않은 경우(size)

 -w file

 file 존재하고 write 속성을 가지는 경우

 -x file
 file 존재하고 일반 파일의 경우 실행권한이 디렉토리의 경우 검색 권한이 있는 경우

 -O file

 file 의 소유자인 경우
 -G file
 file 의 그룹ID 가 현재 사용자 그룹과 일치하는 경우

 file1 -nt file2

 file1 이 file2 보다 나중에 작성된 파일인 경우

file1 -ot file2

 file1 이 file2 보다 이전에 작성된 파일인 경우


3. 정수조건


-lt

 작다
 -le  작거나 같다.
 -eq  같다.
 -ge  크거나 같다.
 -gt  크다
 -ne  같지 않다.


## for 문

bash 의 for 문은 다른 언어들처럼 반복횟수나 반복할 값의 범위를 지정하지 못한다. 값의 목록을 정해 놓고 사용해야 한다.

for name [ in list ]

do

statements that can use $name ...

done

in list 를 생략할 경우 "$@" - 따옴표로 묶은 명령행 인자목록 - 이 기본값이 된다. 하지만 모든 언어가 그렇듯이 명확하게 기술해주는 습관을 들이자!


## case 문

bash 의 case 는 다른 언어들처럼 간단한 값을 검사하는 것이 아니고, 와일드카드 문자 사용이 허락되는 패턴을 놓고 문자열을 검사하는데 사용된다.

case expression in

pattern1)  

statements ;;

pattern2)

statements;;

...

esac

pattern 에 해당하는 부분은 '|' 를 사용하여 여러개의 패턴을 표현할 수 있다.


# select 문

간단한 메뉴를 쉽게 사용할 수 있게 해준다.

select name [in list]

do

statements than can use $name...

done

for 문과 동일, for 대신 select 사용. 따라서 in list 를 생략하면 동일하게 "$@" 으로 대체된다.

select 문이 하는 일은 다음과 같다.

- list 에 있는 항목으로 된 메뉴를 생성, 형식은 번호로 선택하도록 되어있다.

- name 변수에 선택한 내용을 저장한고 선택한 번호는 내장 변수인 RELAY에  저장

- statments 를 실행

select 의 번호를 선택하게 하는 프롬프트는 PS3 을 사용한다. 기본값으로 #? 이 사용되지만, 원한다면 바꿀 수 있다.

select 구문에서 break 는 C 언어의 break 와 동일한 역할을 한다. 하지만, case 문의 경우에는 ;; 이 break 역할을 대신한다.


# while / until 문

조건이 참인 동안(while) 또는 조건이 참일 때까지(until) 코드를 반복하는 역할을 수행한다.

while condition

do

statements...

done

==========================

until condition; do

statements...

done

until 문의 경우 C언어와 달리 조건이 제일 위에서 수행된다는 점에 유의한다. 실제로 until 문은 잘 사용하지 않는다.

while 문은 조건이 참인동안, until 의 경우 조건이 거짓인 경우에 루프가 실행된다.