본문 바로가기

학원

2023/06/13 ShellScript

리눅스 쉘 스크립트


Linux Shell

 

- Shell이란 유닉스 리눅스 환경의 대화형 사용자 인터페이스를 말함
- 사용자가 입력하는 명령어를 입력하고, 실행하는 역할
- 운영체계의 바깥 계층에 위치하며, 사용자와 커널의 의사소통을 담당
- cshell, bourneshell, bashshell, tcshell, kornshell, 등 다양한 종류가 있음
- Shell의 고급사용이 ShellScript

변수 - 데이터를 저정할 수 있는 공간 ( 어떠한 값을 저장하게 되면 컴퓨터는 문자열로 밖에 못받는다.
그렇기 때문에 간단한 덧셈도 숫자값이라고 알려주지 않으면 못한다. )

 


변수는 지역 변수, 환경 변수가 있다.

 

 

지역 변수 - 자신을 생성한 Shell에서만 사용할 수 있다.
환경 변수 - 자신을 생성한 Shell뿐만 아니라, 이로부터 파생되어 나온 자식 프로세스에서도 사용할 수 있다.

변수라는건 shell이 만든다 그때 지역변수라는건 이 변수를 만든 shell에서만 사용가능
환경변수는 이 변수를 만든 shell뿐만 아니라 자식 프로세스에서도 사용 가능
1회성으로 쓰는 것은 지역변수로 사용 설정값이나 영구정으로 쓰는건 환경변수를 주로 사용한다.
변수 이름에는 알파벳 "a ~z, "A~Z", "0~9", 언더스코어 ( _ )로 이루어진 총 63개의 문자를 사용 할 수 있으며,
변수명의 첫 글자는 반드시 알파벳 혹은 밑줄문자 ( _ )이어야 한다.
Shell프로그램이나 ShellScript는 공백이 올 수 없기 때문에 스페이스 바를 누르는 것을 생각하고 눌러야함

 

 

 

 

export를 안붙이고 붙이고에 따라서 환경변수인지 지역변수인지 나뉜다.
echo A를 하면 이게 변수인지 모르고 문자열이라고 판단하기 때문에 $를 붙여줘야 변수이름이라고 인식을 한다.

 

 

 

변수 목록 출력은 본인이 맘에 드는걸 쓰면 된다. env를 치면 지역변수는 안나옴.

터미널 창이 종료가 된다는건 접속이 끊어진다는건데 사용하던 Shell도 사라지기 때문에 만들었던 변수도 사라지게 된다.
로그인하고 env하고 치게되면 나오는건 무엇이냐

 

 

 

vi .bash_profile을 치면 etc아래에 있는 bashrc에 있는 $PATH에는 /usr/bin /usr/sbin등등이 있다.

 

 

 

내가 환경변수로 영구적으로 저장하고 싶은 내용이 생긴다면 vi ./.bash_profile를 써서 export PATH 아래에 원하는 내용을 적을 수 있고
source .bash_profile으로 환경변수를 저장시킬 수 있다.

 

 

 

root로 다시 접속을 했을 때 위에서 했던 다른 변수들은 사라진걸 볼 수 있지만 export PATH아래에 적은 환경변수의 내용은
남아 있는걸 확인할 수 있다.

 

 


연습 Script
script라는 이름의 디렉터리를 만든다.
vi ./test.sh쳐주고 들어온다.

 

Script는 대부분 .sh으로 하게된다.
Script의 문서편집기는 첫번째 줄에 어떤 shell을 사용할지 다른말로 어디에서 사용하는지를 작성하게 된다.
저장하고 나간다.

 

 

 

ls -l를 쳤을 때 그냥 파일이였고 chmod +x를 통해서 실행권한을 주었다.

 

 

 

그리고 ./test.sh를 쳤을 때 각각의 입력해놓은 변수들이 출력이 되는걸 볼 수 있다.


 

※ShellScript는 따옴표랑 쌍따옴표를 구분하기 때문에 쌍따옴표를 붙이거나 아예 안붙인건 제대로 출력이 되지만
그냥 따옴표를 붙인것은 $var1, $var2로 출력하게된다.



 

간단한 연산을 할 수 있는 명령어
vi ./calc.sh을 입력하고 이런식으로 작성해준다.
echo "Sum: $num1 + $num2" 은 안되는 것이다. 컴퓨터 입장에선 A + A, 안녕하세요 + 반갑습니다 이런느낌이다.
그렇기 때문에 앞쪽에 expr을 붙이고 싱글커터인 `을 붙여준다.
곱셈 부분에서 *앞에 \를 붙인 이유는 리눅스에선 모든것을 포함하기 때문에 구분하기 위해서 \을 붙여준다.

 

 

 

이렇게 입력하면 간단한 사칙연산을 할 수 있다.

 

 

vi ./para.sh입력하고 들어와서 이런식으로 작성해준다.
출력받는 하는 부분은 Name과 Age Addr사이에 ,가 들어가도 되지만
입력하는 부분인 read name age addr에선 아무것도 들어가선 안된다.
./para.sh를 하면 실행하면서인자값에 따라 변수가 만들어지는것이다.

 

 

 

그냥 ./para.sh를 하면 $0번에만 해당하는 출력이 된다.
./par.sh 100을 하면 뒤에오는 100은 $1에 해당하는 부분이된다.
뒤에 오는 차례대로 $2와 $3이 오게 되고 그 뒤에 오는건 모든 $*로 모든 인자값으로 출력이 되는 것


 

하나의 저장공간에서 여러 데이터를 저장할 때 배열이라는걸로 한다.
간단한 배열연습
vi ./arr.sh을 쳐서 들어온 후 이런식으로 작성해준다.
${}이렇게 하면 배열이라고 하는 것
${ARR[?]} ?안에 1이 들어오면 Index1번을 하고 2번은 Index2번 @가 들어오면 모든걸 뜻함
아래는 그냥 노가다로 하는것이고 위에 방법으로 해도 된다. 단 띄어쓰기를 유의해야함

 



 

chmod +x ./arr.sh해서 실행권한을 주고 ./arr.sh를 쳐서 확인해본다.


 



Linux ShellScript 제어문 연산자
조건 제어문

 

 

비교 제어문

 

 

 

리눅스에서 <,>,=이 그냥 들어가면 다르게 해석하면서 실행하기 때문에 빨간 박스 안에 있는걸 꼭 지정해줘야함
논리 연산제어문

 

 

 

기타 제어문

 

 





제어문 if문 예시

 

 

마지막 지점을 알려줘야하기 때문에 if를 반대로 치는 fi로 치는 마크라고 한다.

 


예제


 

[root@MyLinux ~]# vi ./if_test3.sh
#!/bin/bash
echo -n "Input Data: "
read data

if [ $data -ge 0 ]; then
        if [ `expr $data % 2` -eq 0 ]; then
                echo "Input Data Positive Even Number"
        else
                echo "Input Data Positive Odd Number"
        fi
else
        echo "Input Data Negative Number"
fi


[root@MyLinux ~]# chmod +x ./if_test3.sh
[root@MyLinux ~]# ./if_test3.sh
Input Data: 100
Input Data Positive Even Number

[root@MyLinux ~]# ./if_test3.sh
Input Data: 99
Input Data Positive Odd Number

[root@MyLinux ~]# ./if_test3.sh
Input Data: -10
Input Data Negative Number


 

이 예제는 숫자를 넣었을 때 2로 나눠서 나머지가 0과 같다면 짝수
아니라면 홀수라는 것
여기서 중요한 점은 if문 안에 if문이 있다는 것이기 때문에 안에 있는 if문도 fi로 끝내줘야한다.


 

[root@MyLinux ~]# vi ./if_test4.sh
#!/bin/bash
echo -n "Input Your Kor Score: "
read kor

echo -n "Input Your Eng Score: "
read eng

echo -n "Input Your Mat Score: "
read mat

Sum=`expr $kor + $eng + $mat`
Avg=`expr $Sum / 3`

echo ""
echo Your Kor Score: $kor
echo Your Eng Score: $eng
echo Your mat Score: $mat
echo Your Total Score: $Sum
echo Your Average Socre: $Avg
echo ""

if [ $Avg -lt 70 ]; then
        echo "Your Average Score: $Avg Fail"
elif [ $kor -lt 60 ]; then
        echo "Your Kor Score: $kor Fail"
elif [ $eng -lt 60 ]; then
        echo "Your eng Score: $eng Fail"
elif [ $mat -lt 60 ]; then
        echo "Your mat Score: $mat Fail"
else
        echo "Congratulations on your passing the exam"
fi

[root@MyLinux ~]# chmod +x ./if_test4.sh
[root@MyLinux ~]# ./if_test4.sh
Input Your Kor Score: 70
Input Your Eng Score: 70
Input Your Mat Score: 70

Your Kor Score: 70
Your Eng Score: 70
Your mat Score: 70
Your Total Score: 210
Your Average Socre: 70

Congratulations on your passing the exam



 

각각의 국어, 영어, 수학의 시험점수를 적고 합산을 내서 3으로 나눌 때 70보다 크다면 마지막 문구인Congratulations on your passing the exam
라고 뜨게 된다.



 

각각의 국어, 영어, 수학의 시험점수를 적고 합산을 내서3으로 나눌 때 70점보다 작다면 이런 문구가 뜨면서 Fail이라고 뜨게된다.
국어 점수가 60보다 작으면 국어 점수때문에 fail했다고 나오게된다.
국어점수는 통과했다면 그 밑에인 영어를 확인하고 영어가 60보다 작다면 영어 때문에 fail이 했다고 뜨게된다.
똑같이 영어도 통과했다면 마지막인 수학도 확인하고 뜬다.



case 조건

 

 

case문은 뒤에 ;;이 꼭 붙어야함

 

 


case 예제

 

vi ./case_test1.sh를 쳐서 이런식으로 입력을 해준다.


 

./case_test1.sh를 치게 되면 이런식으로 확인 할 수 있다.

 

 


select 조건

 

select 제어문의 경우는 메뉴를 구성할 때 주로 사용한다.

 

 

vi ./select_test1.sh를 치고 이런식으로 입력해준다.



 

1번항목을 고르게 되면 Coke에 2000원이라는게 출력이되고
2번항목은 Sprite에 1800원, 3번항목을 고르게 되면 Fanta로 1500원이 출력된다.
그리고 4번을 누르면 break로 멈춘다.




'학원' 카테고리의 다른 글

2023/06/15 디스크  (0) 2023.06.15
2023/06/14 Shell Script  (0) 2023.06.14
2023/06/12 프로세스 관리 명령어  (0) 2023.06.12
2023/06/09 리눅스 압축파일, kernel  (0) 2023.06.09
2023/06/08 패키지  (0) 2023.06.08