리눅스 서버/수업

쉘 스크립트 프로그래밍

sdafdq 2022. 11. 14. 17:32

리눅스의 많은 부분과 서버 데몬 스크립트는 쉘 스크립트로 되어있음.

 

별도로 컴파일 하지 않고 텍스트 파일 형태로 바로 실행.

 

 

파일명.sh (꼭 이렇게 안해도 실행이 되긴 하나 관례임)

첫줄에 #!/bin/sh

이렇게 작성. 관례임. /bin/sh를 이용해 실행한단 뜻임.

저장 시 실행 접근권한이 없는데, 원하는 대로 chmod로 수정

 

실행

sh 파일명.sh

아니면 실행권한이 있는 상태서 ./파일명.sh로 실행 가능

근데 이게 만약 이 파일이 있는 디렉토리를 $PATH에 등록하면 파일명.sh 만으로도 실행 가능.

 

 

인터프리터 방식이라, 변수를 미리 선언하지 않고 필요할 때 값을 할당하면서 사용

 

모든 변수는 문자열로 취급

testval=7+5

echo $testval

"7+5"로 나옴

 

변수에 값 대입할 때 = 좌우에 공백이 없어야 함.

공백 있는 값 대입시에는 " "안에 써줘야 함

 

 

myVar="Hi Woo"

echo $myVar    //Hi Woo 출력

echo "$myVar" //Hi Woo 출력

echo '$myVar'  //$myVar 출력

echo \$myVar  //$myVar 출력

 

쌍따옴표 안의 변수는 변수로 취급. 그렇게 안하고 싶으면 \붙이면 됨.

myVar="Hi"

echo "$myVar human"

Hi human

 

echo 때 " 출력하고 싶은 \"

 

입력문

read 변수명

선언 할 때는 $ 안씀.

 

숫자계산.

말 했듯이 모든 변수값은 string임.

계산 하려면

expr

expr은 역따옴표(숫자1 왼쪽) 안을 수식으로 처리.

expr 쓸 때 괄호 또는 * 앞에는 꼭 \붙임. ( 괄호 쓸 때는 \( ~~~ \) 이렇게 )

`expr 100 + 200`

`expr \( $num1 + 200 \)  / 10 \* 2`

이거 쓸 때는 오히려 단어 사이들에 다 띄어쓰기 해줘야 함. 사칙연산 키워드, 괄호도 포함.

 

 

파라미터

인자를 받고 싶을 때는

$0, $1 이런 식으로 쓰면 됨.

이렇게 하면 각 모든 명령이 저 인자로 들어감.

예를 들어 

cp man1.txt man2.txt

하면은 cp가 $0이 되고, man1.txt가 $1이 되고, man2.txt가 $2가 된다.

$*는 모든 변수이다.

각자 공백으로 구분해서 출력해준다.

 

조건문

if문

if [ "woo" = "woo" ] //조건 안쪽에는 단어와 단어 사이에 공백을 반드시 넣어줘야 함.

then

    echo "참입니다."

fi

 

if [ 조 건 ]

then

    ~~~//참일 경우의 내용

fi    //조건문 끝내기

 

else문

if [ 조 건 ]

then

    ~~~//참일 경우

else

    ~~~//거짓일 경우

fi

 

if문은 참과 거짓 두 분기만 다룸.

case ~ esac 여러 분기를 다룸.

 

비교 연산자.

문자열 비교

산술 비교

if [ 100 -eq 100 ]

then

    echo "같습니다."

else

    echo "다릅니다."

fi

 

파일 관련 비교 연산자

 

case~esac

 

case "$1" in

    start)

        echo "시작합니다~~";;

    stop)

        echo "중지~~";;

esac

 

case 조건 in

    첫번째케이스)

        ~~~~ ;; // ;;는 ~~~~까지 하고 끝내겠다는 뜻.

    두번째케이스)

        ~~~~ ;;

esac    // 닫기

 

*) 그 외의 모든 케이스.

 

case "$1" in

    start)

        echo "시작합니다~~";;

    stop)

        echo "중지~~";;

    *)

        echo "모름~";;

esac

 

case 용 or

case $answer in
	yes | y | Yes | YES | Y)
    	echo "대단해요!";;
   	[nN]*)
    	echo "아까워요.";;
    *)
    	echo "제대로 입력하세요!";;
esac

 

and or

if [ 100 -gt 50 ] && [ 100 -lt 150]

then

    echo "범위 내 입니다."

else

    echo "범위를 벗어났습니다."

fi

 

-a (&&)

-o (||)

도 가능.

 

 

 

반복문

for문

hap=0

for i in 1 2 3 4 5 6 7

do

    hap=`expr $hap + $i`

done

echo " 1 ~ 7 : "$hap

 

for 인덱스로쓸변수 in 인덱스변수에들어갈값들

do  // 여기서 부터 해라

    ~~~~~

done // 여기까지 끝내라

 

 

while [ 조 건 ]

do

    ~~~~~

done

 

while [ 1 ]  //무한반복

while, if 다음 띄어쓰기 해야 함.

 

배열

배열이름=(값1 값2 값3)

array=(1 2 3 4)

 

접근

${배열이름[인덱스]}

 

$배열이름

첫번째 인덱스의 값만 출력

 

 

여러 배열

array="A B C D"

array={1..100}    //1~100까지

array={1..100..5}  //1~100까지 중 5씩 띄어서. 1,6, 11

 

for i in array

for i in {1..100}

 

 

until [ 조 건 ] 

while이랑 같은데 대신 조건이 거짓인 동안 반복

 

break, continue, return 사용 가능.

 

함수 만들기

myFunction(){

    ~~~~~~

    return

}

 

함수 부르기

myFunction

함수 콜 시에는 괄호는 딱히 안씀.

 

인자 넣기

myFunction(){

    echo `expr $1 + $2`

    return

}

 

부르기

myFunction $1 $2

인자를 저렇게 넣어 부른다.

괄호는 단지 이거 함수라는 표시인 듯.

 

그리고 

 

꼭 함수 구현 후에 사용 해야 함. 절차지향적? C같은..

근데 myFunction(); 처럼 먼저 선언해주는 건 안됨.

그냥 위쪽에 구현 자체를 한 후에 사용할 수 있음.

'리눅스 서버 > 수업' 카테고리의 다른 글

텔넷 서버  (0) 2022.11.21
원격지에서 리눅스 서버 관리  (0) 2022.11.21
  (0) 2022.11.14
디스크 관리  (0) 2022.11.09
네트워크  (0) 2022.11.07