[Alex] 데이터 장인의 블로그

[Linux] Bash 쉘스크립트 사용법 정리 본문

Linux&OS

[Linux] Bash 쉘스크립트 사용법 정리

Alex, Yoon 2021. 12. 12. 23:57

쉐뱅(Shebang)

#! 로 선언하여 이 스크립트를 어떤 인터프리터로 지정하겠다는 명령어

#!/bin/bash

사용할 수 있는 쉘 확인 방법

  • cat /etc/shells

주석 처리 

  • #로 시작하면 주석

vi 상태, insert ( i ) 모드에서 한줄 삭제하기 

  • dd

함수 만들기

함수 예시 스크립트 

#!/bin/bash

hello_function() {
  echo "Hello!!!"
}

hello_function # 함수 선언

실행 예시

$ sh func.sh
Hello!!!

함수에 인자전달 및 함수에서 값 리턴

인자전달 

함수 내부에서는 $1$2와 같은 형식으로 인자에 접근할 수 있습니다.

#!/bin/bash

my_function() {
  echo "Calling my_function p1: $1, p2: $2"
}

my_function aaa 123
$ sh func.sh
Calling my_function p1: aaa, p2: 123

값 리턴 

함수에서 어떤 값을 리턴할 때 return 키워드를 사용하면 됩니다. 다른 언어들과 같이 return이 호출되면, 함수가 종료되며 값이 리턴됩니다. 리턴이 되면, 함수 외부에서 $?를 통해 return value를 읽을 수 있습니다.

#!/bin/bash

my_function() {
  echo "Calling my_function p1: $1, p2: $2"
  return 100
}

my_function aaa 123
ret=$? #return value 변수 저장 

echo "Return value: $ret"
$ sh func.sh
Calling my_function p1: aaa, p2: 123
Return value: 100

변수 사용시 주의할 점

  • 변수 사용시 = 기호 앞뒤로 공백없이 사용
  • 파이썬과는 달리 띄어쓰기를 하면 에러 발생. 
  • 함수 안에서 사용하는 변수는 local, 이외에는 global

위치 매개변수

  • $0 : 실행된 스크립트 이름
  • $1 : 인자 순서대로 부여 10번째 부턴 "{}" 감싸줘야 함
  • $@ : 전체 인자값
  • $# : 매개변수 총 개수
  • $? : 실행 명령의 exit code(성공한 경우 0, 더 궁금하면 bash exit code 검색)

반복문 (Loop 문) 

for 문 

for i in (seq 변수나 직접 변수 입력) 

do [명령어 입력] done 

#!/bin/bash
SEQUENCE=$(seq 0 9)
for i in $SEQUENCE
do
  echo "Running loop seq ${i}" 
done
$ sh func.sh
Running loop seq 0
Running loop seq 1
Running loop seq 2
Running loop seq 3
Running loop seq 4
Running loop seq 5
Running loop seq 6
Running loop seq 7
Running loop seq 8
Running loop seq 9

seq 안쓰고 수동으로 입력하기 

#!/bin/bash
ORDER="5 6 7 8 9 4 3 2 1 0"
for i in $ORDER
do
  echo "Running loop ${i}" 
done

C / C++ 스타일 Loop 문

#!/bin/bash
for ((i=0;i<=9;i++))
do
  echo "Running loop "$i
done

while 문 

조건이 true일 때 실행

while [조건]; do

 

마찬가지로 실행 횟수 지정이 필요하지 않는 반복문이 필요할 때 사용 

tip. 비교 표현식 줄임말

  • eq - equal(=)
  • ne - not eqaul(<>)
  • lt - little(<)
  • le - little or equal (<=)
  • gt - greater(>)
  • ge - greater or eqaul(>=)
#!/bin/bash

count=0
while [ ${count} -le 5 ]; do
  echo ${count}
  count=$(( ${count}+1 ))
done

조건문 (if elif)

if [ condition ]; then ~ fi로 구성(fi는 if를 거꾸로)

if_test.sh

AND 조건 : &&

OR 조건 : ||

#!/bin/bash
string1=$1
string2=$2
string3="awesome"

if [ ${string1} == ${string2} ]; then
    echo "string 1, string2 is same"
elif [ ${string1} == ${string3} ]; then
    echo "string 1 is awesome"
else
    echo "else condition"
fi
$ sh func.sh
string 1, string2 is same

선택문(case)

  • 정규식을 지원
  • | 기호로 다중값 입력 가능(or 조건)
  • 조건 문장 끝에 ;;로 끝을 표시
  • case ~ esac(easc는 case 거꾸로)
  #!/bin/bash

  for string in "hi" "HELLO" "WORLD" "hello" "world" "wow" "awesome" "start" "end" "etc"; do
      
      # case 문 시작
      case ${string} in
          hello|HELLO)
              echo "hello or HELLO : ${string}"
              ;;
          wo*)
              echo "wo로 시작하는 단어 : ${string}"
              ;;
          a*|end)
              echo "a로 시작하는 단어 or end일 때 : ${string}"
              ;;
          *)
              echo "기타 : ${string}"
              ;;
      esac # case 거꾸로
  done
$ sh func.sh
기타 : hi
hello or HELLO : HELLO
기타 : WORLD
hello or HELLO : hello
wo로 시작하는 단어 : world
wo로 시작하는 단어 : wow
a로 시작하는 단어 or end일 때 : awesome
기타 : start
a로 시작하는 단어 or end일 때 : end
기타 : etc

set 변수 (명령 실패 시 스크립트 자동 종료)

선행 명령 성공조건에 따른 실행 조건

  • 만약 git으로부터 소스코드를 가지고 온 후에 clean 작업과 make 작업을 순차적으로 시행하여야 한다면? 
  • 여기서 중요한 점은 순차적으로 실행시키되, 선행하는 명령에 오류 혹은 문제가 발생할 경우 후행 명령을 수행하지 않아야 한다. 
#!/bin/bash

set -e # set -e 옵션을 설정, 리턴 값을 체크하여 0(성공)이 아닐 경우 자동으로 종료. 
git pull
make clean
make


# set -x 명령을 실행하기에 앞서서 명령을 출력,
# -e로 종료되었을 경우 어디서 종료되었는지 디버깅하기에 용이 
set -ex # set -e +x 
git pull
make clean
make
  • set -e : 오류가 발생하면 스크립트를 바로 종료. 파이썬에서 오류나면 그 밑에 실행안되는 것을 해주는 옵션. 
  • set -x : 어디서 오류가 발생했는지 출력, set -e 명령어와 주로 함께 사용됨. 
  • set -u : 정의하지 않은 변수가 있으면 바로 종료
  • set -o pipefail : 파이프라인의 명령이 실패하면 해당 리턴 코드가 파이프라인의 리턴 코드로 사용됨

 

 

 

반응형
Comments