개발 블로그

[Linux] Shell Scipt(쉘 스크립트) 작성 본문

시스템/시스템 프로그래밍

[Linux] Shell Scipt(쉘 스크립트) 작성

갹둥 2024. 9. 7. 00:31

 오늘은 쉘 스크립트 기초 문법에 대한 블로그를 작성해보겠습니다...옛날에 찍먹으로 배워서 까먹었는데 이것이 리눅스다 책과 검색을 통해 복습했습니다..

 

 반복적인 작업을 수동으로 수행하는 것은 시간이 많이 걸리고 실수를 유발할 수 있습니다. 이러한 문제를 해결하는 강력한 도구 중 하나가 바로 쉘 스크립트입니다. 쉘 스크립트는 시스템의 다양한 작업을 자동화하고, 복잡한 명령어를 간편하게 실행할 수 있게 도와주는 도구입니다.

 

  • 리눅스는 대부분 C언어로 작성했기 때문에 C언어와 유사한 방법으로 프로그래밍 가능
  • 일반 프로그래밍 언어와 비슷하게 변수, 반복문, 제어문 등 사용 가능
  • 별도의 컴파일 과정 필요 없이 바로 셸에서 실행 가능
  • 주로 vi eitor나 gedit으로 작성

 

실행 방법

  1. sh 명령어
    1. sh {scriptFileName}.sh
  2. 실행 가능한 속성으로 변경한 후 실행
    1. chmod로 x(실행) 권한 부여한 후 ./{scriptFileName}.sh
      1. 참고로 ./를 쓰는 이유는 현재 디렉토리가 $PATH 환경변수에 설정되어 있지 않기 때문, 등록되어 있으면 생략 가능

기초 문법

  • 특별한 형태의 주석(#!)으로 첫 행에 꼭 아래의 행을 써줘야 함
#!/bin/bash
  • 변수
    • 셸 스크립트에서는 변수를 사용하기 전에 미리 선언 X, 값이 할당되면 자동으로 변수가 생성된다
    • 변수는 ${variableName}으로 사용 가능
    • 변수에 넣는 모든 값은 문자열(String)으로 취급
    • 변수 이름은 대소문자 구분함
    • 변수에 값 대입할 때 ‘=’ 좌우에 공백이 없어야 함
    • $’가 들어간 글자를 출력하려면 ‘’로 묶어주거나 ‘\’(escape 문자)를 넣어줘야함
test=Hello
test2="HELLO"
echo $test
echo $test2
echo "$test"
echo '$test'
echo \$test
Hello
HELLO
Hello
$test
$test
  • 숫자 계산
    • 변수에 모든 값을 문자열로 취급하기 때문에 +, -, *, / 등 숫자 연산을 하려면 expr 키워드를 사용해야 함
    • 수식과 함께 꼭 ```로 묶어줘야 함
    • 연산자와 피연산자 사이에 반드시 공백이 있어야 합
    • 수식에 괄호와 *( 곱하기)를 사용하려면 ‘\’를 붙여줘야함
    • expr 대신 $(( ... )) 구문을 사용하는 것이 더 쉽고 직관적
      • 이 구문은 산술연산을 위한 것이므로 안에 escape 문자 필요 없음
#!/biin/sh
num1=10
num2=20
num3=2

result1=$num1+$num2
result2=`expr $num1 + $num2`

echo "result1 = $result1"
echo "result2 = $result2"

result3=`expr \( $num1 + $num2 \) / $num3 + 100`
echo "result3 = $result3"

result4=$(( $num1 + $num2 * $num3))
echo "result4 = $result4"

result5=`expr \( $num1 + $num2 \* $num3 \)`
echo "result5 = $result5"

exit 0
result1 = 10+20
result2 = 30
result3 = 115
result4 = 50
result5 = 50
  • 파라미터 변수
    • 파라미터 변수는 $0, $1, $2 … 등의 형태를 가짐
      • ex) yum -y install gftp$0: yum , $1: -y, $2: install, $3: gftp, $*: 전체 변수
#!/bin/bash
  
echo "Script File name is $0"
echo "Parameter is $1"

exit 0
~$ sh test.sh temp.txt
Script File name is test.sh
Parameter is temp.txt
  • if~else문
    • 기본 문법 구조는 다음과 같음
    • if [ condition ] then [ when condition is true ] elif [ condition2 ] then [when conditon2 is true ] else [ when condition and condition2 is false ] fi
    • [ ] 안에 공백 필수
    • 조건문은 fi로 종료
    • if [ condition ]; then 형식으로 한 줄에 작성할 때는 ;가 필요
    • 조건문에 들어가는 비교 연산자
      • 문자열 비교 연산
        • =’, ‘
        • -n “string1”: 문자열이 NULL이 아니면 참
        • -z “string2”: 문자열이 NULL이면 참
      • 산술 비교 연산
        • $num1 -eq $num2: 수식이 같으면 참
        • $num1 -ne $num2: 수식이 다르면 참
        • $num1 -gt $num2: 왼쪽 수식이 더 크면 참
        • $num1 -ge $num2: 왼쪽 수식이 더 크거나 같으면 참
        • $num1 -lt $num2: 왼쪽 수식이 작으면 참
        • $num1 -le $num2: 왼쪽 수식이 작거나 같으면 참
        • !{수식}: 수식이 거짓이면 참
    • 파일과 관련된 조건
      • -d: 파일이 디렉토리면 참
      • -e: 파일이 존재하면 참
      • -f: 파일이 일반 파일이면 참
      • -g: 파일에 set-group-id가 설정되면 참
      • -r: 파일이 읽기 가능이면 참
      • -s: 파일의 크기가 0이 아니면 참
      • -u: 파일에 set-user-id가 설정되면 참
      • -w: 파일이 쓰기 가능 상태이면 참
      • -x: 파일이 실행 가능 상태이면 참
  • case~esac
    • 여러 케이스 처리, 다중 분기
    • 맨 뒤에 ;; 붙혀야함
#!/bin/bash

echo "Y/N ? "
read PARAM

case "$PARAM" in
	Y)
    	echo "YES";;
	N)
    	echo "NO";;
	*)
    	echo "What?";;
esac

exit 0
$ sh test.sh 
Y/N ? 
Y
YES
$ sh test.sh 
Y/N ? 
N
NO
$ sh test.sh 
Y/N ? 
?
What?
  • for~in문
    • 기본 구조
    • for variable in var1, var2, var3... do # do done
    • 기존의 for문과 동일하게 i=0; i<10; i++ 이런 식으로 사용 가능
#!/bin/bash 
sum=0 
for i in 1 2 3 4 5 6 7 8 9 10 
do 
    sum= $((sum + i))
done
    echo "sum is $sum" exit 0

 

  • while문
    • 조건식이 참인 동안 계속 바복
    • 1 또는 :이 오면 항상 참 → 무한 반복
    • 기본 구조
#!/bin/bash
sum=0
i=1
while [ $i -l 10 ]
do
    sum=$((sum+i))
    read i
done

echo "sum is $sum"
exit 0
  • eval
    • 문자열을 명령문으로 인식하고 실행
#!/bin/bash
str="ls -l"
echo $str
eval $str
exit 0