4. 쉘 문법

exit status

쉘 명령어는 종료시 0~255 까지의 exit status 를 돌려 줄 수 있다. 불린 값으로 형변환시 0 은 true 이고 다른 모든 값은 false 로 변환된다. 만약 리턴값을 명시적으로 돌려주지 않으면 마지막에 실행된 커맨드의 리턴값을 반환한다. 또한 해당 값을 프로세스간의 정보 전달 수단으로 사용 할 수 있다.

and 그리고 or

유닉스는 true, false 라는 커맨드를 가지고 있다. and(&&) 는 앞의 명령어 결과가 true 일 경우 다음 명령어를 실행한다. or(||) 은 앞의 명령어 결과가 false 일 경우 다음 명령어를 실행한다.

true && echo "Printed"
false && echo "Not printed"

true || ehco "Not printed"
false || echo "Printed"

리스트 만들기

쉘은 파이프 라인을 리스트로 만드는 5개의 캐릭터를 가지고 있다. - 첫번째는 줄바꿈 문자이다. - ;은 앞의 결과를 뒤의 인풋으로 받지 않을 경우 사용한다. cmd1 ; cmd2 ; cmd3 ; - &은 detached 모드로 실행하며 실행, 종료 순서가 순차적이지 않다. cmd1 & cmd2 & cmd3 & - && 앞에 두개가 성공해야 cmd3 가 실행된다. cmd1 && cmd2 && cmd3 - || 앞의 두개가 실패해야 cmd3 가 실행된다. cmd1 || cmd2 || cmd3

우선순위

기호 실행 순서
| 0
&&, || 1
;, & 2

간단한 if 문 흉내

cmd1 && {cmd2; exit 0; } || cmd3

(), {} 의 차이점

만약 명령어의 실행 순서를 바꾸고 싶다면 위의 괄호들을 사용 할 수 있다. - 문법적 차이점 - {} 의 경우 양쪽에 스페이스를 주어야한다. - {}의 경우 안의 명령어 끝에 ;을 줘야 한다.

(echo a); echo b
{ echo a; }; echo b
  • () 은 새로운 프로세스를 실행 시킨다.
    • 현재 프로세스에 영향을 안주고 싶을떄 유용하다.(현재 디텍토리 변경등)
a=OLD
(a=NEW1); echo $a
{ a=NEW2 }; echo $a

플로우 컨트롤 커맨드

쉘에서 명령어는 총 3가지 방법으로 묶일수 있다. - 단순 커맨드: 스페이즈로 분리된 워드 집합 - 파이프라인: 여러개의 단순 커맨드가 | 로 연결될 형태 - 리스트: 여러개의 파이프라인이 &, ;, &&, || 로 구분되어 있고 ;, &, new line 캐릭터 으로 끝나는 것.

복합 커맨드

복한 커맨는 아래 7개의 형태가 있다.

## 1
if list then 
    list 
fi

## 2
if list then 
    list 
else 
    list 
fi

## 3
if list then 
    list 
elif list then 
    list 
elif list then 
    list 
fi

## 4
if list then 
    list 
elif list then 
    list 
else 
    list 
fi

## 5
if list then 
    list 
elif list then 
    list 
elif list else 
    list 
fi

## 6
while list do list done

## 7
until list do list done

라인의 맨앞에 와야 하는 커맨드들

본쉘에서는 특이한 컨샙이있다. 아래의 단어들은 꼭 라인의 첫 번째 단어여야 한다.

if
then
else
elif
fi
case
for
while
until
do
done
{
}

하지만 ;, & 을 쓰면 라인을 변경하니 이 다음에 적어도 된다. - list 를 ;, &, new line 캐릭터 으로 끝나는 것으로 정의 했음으로 아래의 표현식은 늘 허용된다. - if list then list fi

if true
then
echo 'it was true'
fi

if true; then echo 'it was true'; fi

if command

if/then 은 커맨드 리스트를 실행한 exit 상태를 테스트해서 특정 리스트를 실행하는 형태를 만든다.

if 문이 아니라 if 명령어 이다. 명령어 처리 방식으로 if 문을 구현 했다라고 생각하면 이해가 쉽다.

if 명령어는 다음에 나오는 list 가 true 일 경우 then 뒤의 list 를 실행시킨다. false 일경우 else 뒤의 list 를 실행시킨다. if/then, else 의 경우 반드시 뒤에 리스트가 표기됨이 문법임으로 없을 경우 아무것도 안하는 명령어:를 넣어 문법을 만족 시켜준다.

if list; then :; else
    list
fi
  • if []; [ 은 test 명령어의 별명이다.
  • if [[...]]; [[ 은 test extend 키워드의 별명이다.
    • 키워드: 한개의 명령어를 구성하는 subunit

While - true 일때까지 루프

특정 조건이 true 일때까지 반복실행

while mytest
do
    echo mytest is still true
done
  • 표준인풋에서 읽어서 파일의 끝이면 while 종료
echo "Type Ctrl+D(EOF) when done"
while read a
do
echo $a
done

Until - loop until true

특정 조건이 true 가 아닐때까지 반복 실행

until testa
do
echo not yet
done

본쉘 플로우 변경 문법

for name do list done
for name in word ... do list done
case word in easc
case word in pattern ) list;; easc
case word in pattern | pattern ) list;; easc

For - 변수를 변경 할 수 있을때까지 반복

for i in 1 2 3
do 
echo $i
done
ns=(1 2 3)
for i in $ns
do
echo $i 
done
  • 원본 아래 내용은 개인용으로 정리한 내용 입니다.