이것이 점프 투 공작소

쉘 스크립트 개요 본문

리눅스

쉘 스크립트 개요

겅겅겅 2022. 10. 12. 21:36

 

쉘 스크립트란?

쉘 명령어로 이루어진 텍스트 파일입니다. 긴 작업이나 반복적인 작업을 작성하여 효과적으로 실행 시킬 수 있습니다

 

 

쉘 스크립트 실행 명령어

1. bash script_file

  • 스크립트 파일에 실행 권한을 추가할 필요 없음
  • 명령 행에서 script_file 다음에 인수 추가 가능 (모든 실행 명령어에서 가능)
  • 서브 쉘을 새로 생성하여 스크립트 실행합니다.

2. ./script_file (위치지정/스크립트파일)

  • 스크립트 파일에 실행 권한 추가 필요
  • PATH 환경변수에 설정된 디렉토리에서 스크립트 파일을 찾습니다.
  • 스크립트 파일의 첫 행에서 #! 다음 /bin/bash를 지정
  • 서브 쉘을 새로 생성하여 스크립트 실행합니다.

3. source script_file 또는 . script_fiel

  • source는 쉘의 내장 명령이며 현재 쉘에서 스크립트 파일 실행합니다.

 

기초문법

  • # 은 주석
  • $0 (스크립트파일 이름), $1 (첫번째 인자), $2(두번째 인자) -> source명령으로 실행하는 경우는 $0은 bash가 됩니다.
  • 변수=값  (=의 좌우에 공백이 있으면 안됩니다.)
  • bash -x script_file -x 와 함께 실행하면 수행되는 명령을 확인 할 수 있습니다. (디버깅 모드)
  • 일반적으로 모든 변수이름은 소문자로 작성합니다.
  • 선언 없이 변수를 사용 할 수 있다 (기본값 빈 문자열)
  • d=$(ls | wc -l) : $() 명령치환, 명령의 결과값을 변수에 할당
  • a=$[5*7] : $[] 대괄호 안 값을 계산 후 대입
  • a=${b}1 : ${}중활호를 사용하면 뒤에 값과 함께 변수로 할당 가능
  • $a=$b : 불가능, 쉘은 하나의 변수를 하나의 명령어로 처리함으로 오류가 발생합니다.

특별한 문법

  • $* : 모든 매개변수를 하나의 문자열로 바꾼다 ex )"123"
  • $@ : 모든 매개변수를 개별의 문자열로 확장합니다 ex) "1" "2" "3"
  • $$ : 쉘의 프로세스ID
  • $# : 매개변수의 갯수
  • $? : 최근 실행된 포그라운드 명령의 종료 상태값 (성공은 0)
  • $! : 최근 실행된 백그라운드 명령의 ID

함수

쉘 스크립트 파일 내에 정의된 함수를 사용 할 수 있습니다.

set명령으로 함수를 확인하고, 없으면 함수가 들어있는 스크립트 파일을 source명령어로 실행하면 쉘 환경에 함수가 추가됩니다. ~./bashrc에 함수를 정의해두면 로그인 시마다 함수가 환경에 추가됩니다.

정의방법

function name{
    command ..
    return
 }
 
 # 또는
 
 name() {
   command ..
   return
 }

두가지 정의 방법이 있습니다. return의 인자가 없으면 직전 명령의 종료 상태값을 리턴합니다.

 

제어문

IF

if command...; then
	command...
[elif command...; then
	command... ] ...
[else
	command...]
fi

;(세미콜론)의 경우 같은 라인에서 다른 단어 (then, elif, else, fi 등)와 구분이 필요할 때 사용합니다.

if, elif 다음에 나오는 마지막 명령의 종료 상태값으로 true,false를 구분합니다. (종료 상태값 0은 true)

if true; false; then 이면 마지막 명령어의 false값을 전달받습니다. 

 

TEST명령

조건이 만족되면 0 아니면 1을 리턴합니다.

if [명령문]; then
echo "hello world"
fi

if test 명령문; then
echo "hello world"
fi

TEST명령 연산자 예시

연산자 설명
file -nt file2 file1이 file2보다 더 빨리 생성되었으면
file -ct file2 file이 file2보다 늦게 생성되었으면
-d file file이 디렉토리면
-s file file이 존재하고 0보다 크기가 크면
-x file file이 실행가능하면
string > string2 string이 string보다 큰가(사전순) 
비교시 \> 를 사용해야합니다.
string = string2 두 문자열이 같으면
-z string 문자열의 길이가 0이면
$1 -eq $2 두 변수가 같으면
exp1 -a exp2 두 식이 모두 참이면 &&
exp1 -o exp2 둘중 하나가 참이면 ||

 

CASE

case $var in
	[pattern [| pattern]...) command ... ;;] ...
esac

CASE사용 예시

case $str in
  *.txt) echo $str
  ;;
  
  a|A) echo "aA"
  ;;
  
  *) echo "default"
  exit
  ;;
  
esae

 

FOR

for i [in word...]; do
  command...
done

# java, c의 형태의 반복문도 사용 가능합니다
for (( i=0; i<10; i++)); do
  command...
done


# 예시
for i in A B C; do echo $i; done

# 예시, 중괄호 확장 A,B,C,D 출력됩니다
for i in {A..D}; do echo $i; done

word는 반복가능한 객체를 의미합니다. 가장 먼저 변수확장됩니다. 기본값은 $@

 

while

while command...; do
    command...
done

참인동안 실행하는 명령문

until

until command...; do
	command
done

거짓인동안 실행하는 명령문