카테고리 없음

[8월 21일] 쉘 스크립트

ljm 2025. 8. 21. 11:26

 

sh : 초기의 유닉스 쉘

ksh : sh 확장
csh : C언어 기반
bash : sh와 호환

지역변수(local), 전역변수(global), 환경변수, 예약변수, 매개변수 등
대소문자 구분있고, 숫자로 시작할수없다. 모든 값을 문자열로 저장
변수명 앞에 $,  test='1234' 

예약변수 종류 : HOME, PATH, LANG, UID, USER, FUNCTION, TERN 등
산술 연산

 

 

# 현재 사용 중인 셸(shell)의 경로 확인
[root@localhost ~]# echo $SHELL
/bin/bash

 

# 스크립트 작성
[root@localhost ~]# vi test.sh

#i/bin/bash
echo "Hello World"

//스크립트의 제일 윗줄은 쉘 선언문 (Shebang)

# 권한 부여
[root@localhost ~]# chmod 755 test.sh

# 퍼미션 확인
[root@localhost ~]# ls -l
total 8 -rw-------. 1 root root 813 Aug 19 14:29 anaconda-ks.cfg
-rw-r--r-- 1 root root 33 Aug 21 09:16 test.sh


# 스크립트 실행 방법
[root@localhost ~]# ./test.sh
Hello World
[root@localhost ~]# sh test.sh
Hello World
[root@localhost ~]# bash test.sh
Hello World

스크립트 작성

 

 

 

 

#test.sh 를 통해 script 학습하기

 local 키워드를 앞에 붙이면 그 함수의 지역변수로 동작

지역변수 string 설정 및 함수 설정
스크립트 출력

 

declare 키워드는 변수를 지정하고 속성을 지정

 

declare를 이용한 변수 설정

 

# 환경변수 export 예제 
[root@localhost ~]# vi export.sh

#i/bin/bash echo
${hello_world}

[root@localhost ~]# chmod 755 export.sh
[root@localhost ~]# export hello_world="Test Test"
[root@localhost ~]# bash export.sh

// export를 사용하여 변수를 환경 변수로 만들고, 부모-자식 프로세스 간에 변수 값을 공유
// 현재 셸뿐만 아니라 이 셸에서 실행되는 모든 자식 프로세스에서도 이 변수에 접근가능

 

# 매개변수
[root@localhost ~]# vi export.sh

echo "script name : ${0}"
echo "total arg : ${#}"
echo "second arg : ${2}"
echo "total arg value : ${@}"

# 예제 스크립트 실행
[root@localhost ~]# bash export.sh
script name : export.sh
total arg : 0
second arg :
total arg value :

[root@localhost ~]# bash export.sh a b c d e
script name : export.sh
total arg : 5 second
arg : b total
arg value : a b c d e

 

 

declare 를 사용하지않고 산술 연산 변수로 연산 가능
곱셈은 역슬래쉬와 함께

 

[root@localhost ~]# vi export.sh

number1=10
number2=20
plus='expr $number1 + $number2'
mul='expr $number1 \* $number2'

echo "${plus}"
echo "${mul}"
echo "add:$((number1+number2))"

# echo "Hello"
: << "END"
echo "test"
echo "test2" END

// 줄 가장 앞에 '#'을 넣으면 그 라인은 주석처리

[root@localhost ~]# bash export.sh
script name : export.sh
total arg : 0
30
200
add:30

작은따옴표랑 역따옴표 주의하기

 

조건문 if문의 기본구조 

 

if [ 조건1 ]

then

    # 조건1이 참일 때 실행되는 코드

 

elif [ 조건2 ]

    then # 조건1이 거짓이고 조건2가 참일 때 실행되는 코드

 

else

    # 모든 조건이 거짓일 때 실행되는 코드

 

fi

 

[root@localhost ~]# vi export.sh

#i/bin/bash
a=10
b=20
if [ ${a} -eq ${b} ]; then
      echo "a = b"
else
      echo " a != b "
fi
if (( ${a} < ${b} )); then
      echo "yes"

[root@localhost ~]# bash export.sh 
a != b
yes


if [ ${a} -lt ${b} ]; then
    echo "yes"
elif [ ${a} -eq ${b} ]; then
    echo "equal"
else
    echo "no" fi

// 한줄띄기를 하지않고 한줄에 여러문장을 쓰고싶다면 문장끝에 ';'로 끝맺음

 

조건문 case문의 기본 구조

 

case 변수 in

  패턴1)

# 패턴1에 일치할 때 실행될 코드 ;; 패턴2 | 패턴3)

# 패턴2 또는 패턴3에 일치할 때 실행될 코드 ;; *) # 위 패턴 중 어느 것에도 일치하지 않을 때 실행될 코드 ;; esac

 

# case 예제 작성
[root@localhost ~]# sh fi.sh

os=linux
case ${os} in
"linux") echo "Rocky";;
"windows") echo "Windows 11;;
"mac") echo "MacOS;;
esac

# 스크립트 실행
[root@localhost ~]# sh fi.sh
Rocky

 

 

# for문 예제 작성
[root@localhost ~]# vi repeat.sh

#!/bin/bash

for ((i=1; i<=4; i++)); do
    echo $i
done

data="1 2 3 4 5"
for x in $data
do
    echo "${x}"
done 

# 스크립트 실행
[root@localhost ~]# bash repeat.sh
1 2 3 4 1 2 3 4 5

# seq / .. 예제 작성
[root@localhost ~]# vi repeat.sh

for num in `seq 1 5`
do
    echo $num
done

for num in {1..5}
do
    echo $num
done

#스크립트 실행
[root@localhost ~]# bash repeat.sh
seq 1 5 1 2 3 4 5

 

역따옴표(``)와 작은따옴표(')는 셸 스크립트에서 완전히 다른 역할

역따옴표 (``) 또는 $() 로 사용

역따옴표는 명령어 치환(command substitution) 기능 
명령어 실행 후 그 결과값을 반환 (예시: var=$(ls))

작은따옴표는 문자열을 보호하는 역할로 그 자체의 문자로 인식

 

 

 

조건문 while문의 기본 구조

 

while [ 조건식 ]

do # 조건식이 참일 때 반복해서 실행할 코드

done

# while문 예제 작성
[root@localhost ~]# vi repeat.sh

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

# 스크립트 실행
[root@localhost ~]# bash repeat.sh
0 1 2 3 4 5

# while문 예제2 작성
[root@localhost ~]# vi repeat.sh

count2=10
until [ ${count2} -le 5 ]
do
    echo ${count2}
    count2=$(( $count2 - 1 ))
done

# 스크립트 실행
[root@localhost ~]# sh repeat.sh
10 9 8 7 6