본문 바로가기

DevOps & Cloud

Bash Shell 프로그래밍(기초, 예제)

728x90
반응형

Bash는 Bourne again shell의 축약어이다.

Shell은 사용자와 커널 사이의 매개체 역할을 하는 프로그램이다.

대부분의 리눅스 소프트웨어와 같이 상세한 부분 설정이 가능하다.

 

#!/bin/bash #반드시 이걸 적어줘야한다.

arr=("a" "b" "c" "d") #배열 선언

arr_t=(1 2 3 4 5 6 7) #배열 선언

x=4 #변수 선언시 띄어쓰기 금지

arr_t+=(8 9 10)

for i in ${arr_t[@]}; 
do

        if [ $i = $x ] #조건문 시작,대괄호 안에 시작,끝에 반드시 띄어쓰기
        then
                echo "equal"
        elif [ $i -lt $x ]
        then
                echo "$i < $x"
        else
                echo "$i > $x"
        fi #조건문 종료시 fi 반드시 선언
done

v=("abcdefg" "hij" "klm" "nop" "qrs" "tuv") #배열선언
v[3]='x'#배열 인덱스 접근 후 값 교체

echo "${v[0]} ${v[1]} ${v[2]} ${v[3]} ${v[4]}"


for i in {1,2,3,4,5}; do echo $i; done

bahs shell의 문법은 파이썬보다는 엄격하고, C언어보다는 덜 엄격한 느낌이다.

 

변수선언: 변수명=5

변수선언 시 띄어쓰기를 하면 안 된다. 대문자와 소문자를 구별한다. 변수형이 따로 존재하지 않는다.

변수는 기본적으로 전부 문자열로 인식된다.

 

변수 호출: $변수명 or ${변수명}

변수 호출 시 $기호를 사용한다. 

 

<배열>

배열 선언: 변수명=(1 2 3 4 5) or 변수명=("abc" "def" "hij")

배열은 () 기호로 선언하고 콤마로 원소들을 구분하지 않고 띄어쓰기로 구분한다.

 

배열 전체 호출 : ${배열명}

배열의 원소 호출: ${배열명[인덱스]} 

배열명[@]은 배열의 원소 전체를 의미한다.

 

배열의 인덱스의 개수 : ${! arr[@]}

배열의 개별요소의 크기(sizeof): ${#arr[0]}

 

배열의 요소 추가: arr+=("abc") or arr+=(1)

추가할 요소가 한 개 일지라도 배열화 해줘야 한다.

 

배열의 요소 변경: arr [3] = 1

 

bash shell에서의 원소는 불연속적일 수 있다.

ex: (1, '',2, '',3)

 

<반복문>

반복문 선언: for 변수명 in ${배열명[@]}

ex) for i in ${arr[@]}

for i in (1,2,3,4,5)

bash에는 중괄호가 없기 때문에 중괄호의 역할을 해줄 단어들이 필요하다. 반복문에서는 do와 done이 해당 역할을 한다.

 

<조건문>

조건문은 대괄호 [ ]를 사용하고 중괄호가 없기 때문에  if로 시작해서 fi로 끝난다.

대괄호의 시작과 끝부분에 반드시 공백이 존재해야 한다.

 

반복문 조건문에 리눅스 명령어도 사용 가능하다.(배열대신에 디렉토리에 있는 파일명을 요소로 사용하고 싶으면 ls)

 

 

참고: https://inpa.tistory.com/entry/LINUX-%EC%89%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%95%B5%EC%8B%AC-%EB%AC%B8%EB%B2%95-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

[LINUX] 📚 BASH 쉘 프로그래밍 문법 마스터 💯 총정리 (+ 연습예제)

Shell Script 란 Shell Script는 Shell이나 command line 인터프리터에서 구동되도록 작성된 스크립트다. 윈도우에서는 batch(배치파일, .bat) 을 한번쯤은 본적이 있을 것이다. bat 파일을 실행하면 프로그램이

inpa.tistory.com

 

<Bash Shell로 만들어본 소수 찾기>

#!/bin/bash

read n #정수 n 입력

for((i=2; i<=$n; i++)) #2~n 까지 범위
do #반복문 시작
         cnt=0 #나눴을때 0이되는 숫자의 갯수
         ans="Not Prime"
         
         for ((j=1; j<${i}; j++)); #c언어처럼 반복문 사용
         do
                 if [ `expr $i % $j` = 0 ] #띄어쓰기 유의 expr 사용, 나눴을때 나머지가 0이면 cnt 증가
                then
                        cnt=`expr $cnt + 1` #expr 사용 
                fi #조건문 종료
                
        done #반복문 종료
        
        if [ $cnt = 1 ] #1 ~ i-1 범위라서 1로만 나눠져야 소수라고 볼 수 있기때문에 1일때가 정답 조건 
        then
                ans="Prime" #정답조건에 해당하면 ans변수에 prime 대입
        fi #조건문 종료

        echo "${i} is ${ans}" #출력
done #반복문 종료

 

c언어 형식처럼 반복문을 사용하는 게 변수로 범위도 설정할 수 있고 더 사용이 용이하다.

728x90
반응형