쉘프로그래밍 (shell script, bash)

2021. 3. 24. 02:27 기타/Shell script, bash

참조문서 : https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/

1. 출력

  • echo : 자동 줄바꿈
  • printf : c언어랑 비슷

2. 주석

  • #!/usr/bin/env bash
  • #

3. 함수

  • function 을 써도되고 생략해도 된다.
  • 함수선언이 호출 뒤에있으면 에러가 발생한다. (command not found)
    • 에러가 나도 밑에꺼는 마저 실행되는 듯
  • 인자 넘기기 : 함수 인자1 인자2 ...

4. 변수

  • 변수 할당은 = 앞뒤에 공백이 없어야만 된다. (있으면 command not found 발생)
    • 홀따옴표, 쌍따옴표 다 되는 듯
  • 선언된 변수는 기본적으로 전역변수이다. 해당 스크립트에서만 유효하다.
  • 다른 스크립트(A.sh 내부에서 B.sh 를 호출하는 상황) 에서도 해당 변수를 사용하려면 export 를 붙여 환경변수로 만들어야 한다.
  • 함수안에서 선언된 변수 앞에 local 을 붙이면 지역변수가 된다.
  • 변수 해제는 unset 으로 한다.

4-1. 변수형

  • Bash 는 변수 타입을 구분하지 않고 기본적으로 문자열이다. 다만 문맥에 따라 연산처리를 한다.

4-2. 위치 매개변수

문자 설명 비고
$0 실행된 스크립트명  
$1 인자 순서대로 번호가 부여된다. 10번째부터는 "{}"감싸줘야 함 $1 $2 $3...${10}
$* 전체 인자 값  
$@ 전체 인자 값 $*와 동일
$# 매개 변수의 총 개수  
  • 위치 매개변수는 실행인자나 함수인자를 받는데 사용된다.

4-3. 특수 매개변수

문자 설명 비고
$$ 현재 스크립트의 PID  
$? 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태 0=정상종료, 1~255=이상종료
$! 최근에 실행한 백그라운드(비동기) 명령의 PID  
$- 현재 옵션 플래그  
$_ 지난 명령의 마지막 인자로 설정된 특수 변수  

4-4. 확장 매개변수

문자설명비고

문자 설명 비고
${변수}    
${변수:위치} 위치 다음부터 문자열 추출  
${변수:위치:길이} 위치 다음부터 지정한 길이만큼의 문자열 추출  
${변수:-기본값} 변수가 미선언되었거나 null 일때 기본값 지정 위치매개변수는 ${변수:=기본값} 사용
${변수-기본값} 변수 미선언시에 기본값 지정 위치매개변수는 ${변수=기본값} 사용
${변수:?값} 변수가 미선언되었거나 null 일때 값출력 후 스크립트 종료  
${변수?값} 변수 미선언시에 값 출력 후 스크립트 종료  
${#변수} 문자열 길이  

5. 커맨드

  • 쉘스크립트에서는 $(리눅스 명령어 ..) 의 결과인 표준 출력을 문자열로 치환한다.
  • 물론 변수에 할당도 가능하다. ex. today=$(date)

6. 산술 확장

  • $((계산식)) : 계산식 안에 있는 숫자들은 문자열이 아니라 숫자로 연산이 된다.

7. 연산자

  • 논리 연산자
  • 산술 연산자
  • 비트 연산자
  • 기타 연산자
    • , : 2개 이상의 산술 연산을 묶어줌
  • 정수 비교
    • -eq : 같음
    • -ne : 같지 않음
    • >, -gt : 크다
    • >=, -ge : 크거나 같다
    • <, -lt : 작다
    • <=, -le : 작거나 같다
  • 문자열 비교
    • -n : 문자열이 null 이 아닌가
    • -z : 문자열이 null 또는 길이가 0이 아닌가
    • 대소구분은 ascii 코드 값으로 한다

8. 제어문

  • [ 조건문 ] : 뛰어쓰기에 유의하자..

8-1. 반복문

  • break
  • continue
  • while :; do 실행문장 done : 무한반복문

예시

# 지정된 범위 안에서 반복문 필요 시 좋음
for str in "hello" "world"
do
    echo ${str}
done

# 수행 조건이 true 일때 실행됨 (실행 횟수 지정이 필요하지 않은 반복문 필요 시 좋음)
num=0
while [ ${num} -le 5 ]
do
        echo ${num}
        num=$((${num}+1))
done

# 수행 조건이 false 일때 실행됨 (실행 횟수 지정이 필요하지 않은 반복문 필요 시 좋음)
cnt=10
until [ ${cnt} -le 5 ]; do
    echo ${cnt}
    cnt=$(( ${cnt}-1 ))
done

 

8-2. 조건문

  • 실행할 문장이 없으면 오류가 발생한다.
  • 변수는 ""로 감싸주는게 좋다.
    • "[: =: unary operator expected" 에러
  • if [ 조건 ]; then 실행문장1; else 실행문장2; fi

예시

string1="hello"
string2="world"
if [ ${string1} == ${string2} ]; then
    # 실행 문장이 없으면 오류 발생함
    # 아래 echo 문장을 주석처리하면 확인 가능함
    echo "hello world"
elif [ ${string1} == ${string3} ]; then
    echo "hello world 2"
else
    echo "hello world 3"
fi

 

8-3. 선택문

  • 정규식을 지원하며 | 기호로 다중 값을 입력 가능하다.
  • 조건의 문장 끝에는 ;; 기호로 끝을 표시한다.
  • case 선택변수 in

 

9. 배열

  • 배열 변수 사용은 반드시 괄호를 사용해야 한다. ex. ${arr[1]}
  • 쉘스크립트는 1차원 배열만 사용한다.
  • 배열 초기화 : array=("hello" "redboy" "devljh")
  • 배열에 값을 추가할 때는 인덱스가 연결되지 않아도 된다.
  • 배열 복사는 array=(${array[@]} "redboy") 와 같이 한다.
  • 전체 출력 : ${array[@]}
  • 배열 전체 길이 출력 : ${#array[@]}



출처: https://sjh836.tistory.com/152?category=680975 [빨간색코딩]