쉘 프로그래밍 문법들

쉘의 기능
- 명령어 해석기 기능
  사용자와 커널 사이에서 명령을 해석하여 전달
  사용자가 입력한 명령이나 파일에서 읽어들인 명령을 해석하고 적절한 프로그램을 실행

- 프로그래밍 기능
  쉘은 자체 내에 프로그래밍 기능이 있어 프로그램 작성가능
  쉘의 프로그래밍 기능을 이용하면 여러 명령을 사용해 반복적으로 수행하는 작업을 하나의 프로그램으로 제작 가능
  쉘 프로그램을 쉘 스크립트라고 부름

- 사용자 환경설정 기능
  초기화 파일 기능을 이용해 사용자 환경을 설정
  명령을 찾아오는 경로 설정, 새로운 파일의 기본 권한 설정, 다양한 환경변수 설정 등 사용자별로 사용 환경의 특성을 초기화 파일에 설정 가능
  로그인 할 때 이초기화 파일이 실행되어 사용자의 초기환경이 설정됨

쉘 스크립트 시작하기
1. 파일생성
- 파일을 만들기전 해당 디렉터리로 이동
- vi 에디터로 쉘 스크립트 파일 생성
- 일반적으로 쉘 프로그램의 파일 확장자는 .bash 또는 .sh를 사용함
- 이미 존재하는 다른 스크립트의 파일이름과 겹치지 않도록 함

2. 명령어작성
- vi 에디터가 실행되면 명령어 작성
- #!/bin/bash   -> #! 은 쉘에게 이 프로그램을 실행하기 위해서 #! 다음에 오는 아규먼트를 실행프로그램으로 사용한다는 것을 알려주기 위해서 사용된다
- # 는 주석처리로 사용

3. 실행권한 부여
- 쉘 스크립트를 실행하기 전에 실행 권한을 줘야한다.
- 파일이 생성되면 읽기/쓰기 권한은 있지만 실행권한은 없다

4. 쉘 스크립트를 실행
- ./filename.sh



조건문
if
쉘스크립트의 if 문을 사용하는 방식은 다음과 같다
if [ 조건 ];
then
   조건만족시 실행하고자 하는 문장
else
   조건 불만족시 실행하고자 하는 문장
fi
if문 다음의 조건을 검사하여 조건이 참이면 then 이하의 문장을 실행하고, 그렇지 않으면 else 다음의 문장을 실행한다.

elif
elif를 사용하면 여러 조건을 검사할 수 있다.
첫번째 if 명령이 참이 아닐 경우에 elif를 사용하여 변수를 테스트 한다.

if [ 조건1 ]; then
   조건 만족시 실행하고자 하는 문장
elif [ 조건2 ]; then
   조건2 만족시 실행 문장
else
   조건 불만족시 실행하고자 하는 문장
fi

case
case는 여러 패턴을 검사하고, 이에 적절한 구문을 실행시킬 수 있다. 사용자의 입력을 처리하는데 적절하다.

case variable in
  pattern [ | parrern] ....) 문장;;
  pattern [ | parrern] ....) 문장;;
  ...
esac



반복문
for
for 구문은 지정한 범위 안에서 루프를 돌리는데 사용된다. 범위에 사용되는 값은 어떠한 문자열의 집합이라도 가능하다.

for [변수] in [값]
do
         [수행문]
done

value 값은 보통 문자열. variable에는 values의 값이 차례대로 할당되면서 statement의 문장을 수행하게 된다.

for문은 2가지 방법이 있다
1. arg 변수에 1,2,3 데이터를 넣고 이 갯수만큼 돈다
    for arg in 1 2 3
    do
    echo $arg
    done
2. 기존 다른 언어 방식과 유사하다
    for((i-0;i<10;i++))

while
while 조건문
do
   문장
done

for문을 사용해 어떤 명령을 30회 수행한다면 1 2 3 .....27 28 29 30 을 일일이 적어줘야한다


builtins
break
제어문이나 조건문의 루프를 빠져 나갈 때 사용한다

continue
제어문이나 조건문의 처음으로 돌아가서 다시 수행한다

exit n
 현재 쉘을 종료한다. 종료시 n 값을 리턴한다

return
쉘 함수에서 값을 반환 할 때 쓰인다. 0은 성공을 1~125까지는 쉘 에러코드를 나타낸다

shift
쉘의 인자를 한자리씩 왼쪽으로(n -> 1로) 이동 시킨다
shift는 $1 인자를 없애고 각 인자번호를 1씩 줄인다. 즉 $2는 $1, $3은 $2와 같은 식으로 된다. 

조건문 결합 관련 연산자
조건문 A -a 조건문 B : 조건문 A와 조건문 B가 모두 참인지 체크, -a는 AND와 동일
조건문 A -o 조건문 B : 조건문 A와 조건문 B중 참이 하나라도 있는지 체크, -o는 OR과 동일


변수
- 데이터 타입이 없다
- 대소문자 구분
- 값을 대입시에는 변수명 = 값
- 변수를 사용할 때는 $변수면 또는 ${변수명}

ex)
- i=10;        #변수에 값 할당
- z="test";    #변수에 값 할당
- echo $i;    #i 변수를 화면에 출력

매개변수
$0~$9 : 옵션의 각 위치에 따른 매개 변수 값($0는 스크립트 이름)
$@ : 매개변수의 모든 값이며 공백문자로 분리
$? : 마지막 명령의 반환 값
$! : 마지막 백그라운드 명령의 프로세스 ID
$_ : 내장명령어 SET에 의해 할당된 현재 쉘 옵션
$* : 매개변수 모든 값(개별적 인용 없으며 IFS에 의하여 분리)
$$ : 현재 쉘의 프로세스 식별번호



문자열비교
[ string ] : string이 빈 문자열이 아니라면 참
[ string1 = string2 ] : 두 문자열이 같다면 참
[ string1 != string2 ] : 두 문자열이 다르면 참
[ -n string ] : 문자열이 null(빈 문자열) 이 아니라면 참
[ -z string ] : 문자열이 null(빈 문자열) 이라면 참

산술비교
[ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참 ( EQual )
[ expr1 -ne expr2 ] : 두 표현식 갑이 같지 않다면 참 ( Not Equal )
[ expr1 -gt expr2 ] : expr1 > expr2 이면 참 ( Greater Then )
[ expr1 -ge expr2 ] : expr1 >= expr2 이면 참 ( Greater Equal )
[ expr1 -lt expr2 ] : expr1 < expr2 이면 참 ( Less Then )
[ expr1 -le expr2 ] : expr1 <= expr2 이면 참 ( Less Equal )
[ ! expr ] : expr 이 참이면 거짓, 거짓이면 참
[ expr1 -a expr2 ] : expr1 AND expr2 의 결과 ( 둘다 참이면 참 )
[ expr1 -o expr2 ] : expr1 OR expr2 의 결과 ( 둘중 하나만 참이면 참 )

파일조건

[ -b FILE ] : FILE 이 블럭 디바이스 이면 참
[ -c FILE ] : FILE 이 문자 디바이스 이면 참.
[ -d FILE ] : FILE 이 디렉토리이면 참
[ -e FILE ] : FILE 이 존재하면 참
[ -f FILE ] : FILE 이 존재하고 정규파일이면 참
[ -g FILE ] : FILE 이 set-group-id 파일이면 참
[ -h FILE ] : FILE 이 심볼릭 링크이면 참
[ -L FILE ] : FILE 이 심볼릭 링크이면 참
[ -k FILE ] : FILE 이 Sticky bit 가 셋팅되어 있으면 참
[ -p FILE ] : True if file is a named pipe.
[ -r FILE ] : 현재 사용자가 읽을 수 있는 파일이면 참
[ -s FILE ] : 파일이 비어있지 않으면 참
[ -S FILE ] : 소켓 디바이스이면 참
[ -t FD ] : FD 가 열려진 터미널이면 참
[ -u FILE ] : FILE 이 set-user-id 파일이면 참
[ -w FILE ] : 현재 사용자가 쓸 수 있는 파일(writable file) 이면 참
[ -x FILE ] : 현재사용자가 실행할 수 있는 파일(Executable file) 이면 참
[ -O FILE ] : FILE 의 소유자가 현재 사용자이면 참
[ -G FILE ] : FILE 의 그룹이 현재 사용자의 그룹과 같으면 참
[ FILE1 -nt FILE2 ] : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참
[ FILE1 -ot FILE2 ] : FILE1이 FILE2 보다 오래된 파일이면 참
[ FILE1 -ef FILE2 ] : FILE1 이 FILE2의 하드링크 파일이면 참

정수 비교 
-eq 같다면 참($a -eq $b) 
-ne 다르다면 참($a -ne $b) 
-gt 더 크다면 참($a -gt $b) 
-ge 더 크거나 같다면 참($a -ge $b) 
-lt 더 작다면 참($a -lt $b) 
-le 더 작거나 같다면 참($a -le $b) 
 

문자열 비교
= 같다면 참($a = $b) 
!= 다르다면 참($a != $b)

출저  : http://lkrox.blogspot.kr/2013/01/blog-post_14.html


+ Recent posts