리눅스

셸 스크립트 프로그래밍

ho-bolt 2021. 11. 4. 00:49

 

  • C언어와 유사하게 프로그래밍이 가능 
  • 변수, 반복문, 제어문 등의 사용이 가능 
  • 별도로 컴파일 하지 않고 텍스트 파일 형태로 바로 실행
  • vi나 gedit으로 작성 가능 ==pico, nano 
  • gedit ==노트패드처럼 사용 가능 
  • => gui환경에서만 사용이 가능한 것이 위의 다른 스크립트와의 차이점이다
  • 리눅스의 많은 부분이 셸 스크립트로 작성되어 있다. 

 

※magic number

#!/bin/bash ==셸 스크립트 가장 상단에 이렇게 매직 넘버를 넣어준다.

 

이것은 어느 환경에서 실행되는 지 프로그램 이름을 집어넣어주는 것이다

즉 위의 예처럼 적는다면 bin안에 bash에서 실행된다는 의미이다.

# which는 위치정보를 알려줌

 

먼저 mkdir -p/app/script를 만들어 구조 

vi first.sh를 통해 first.sh에 echo hello를 작성하고 나온다. 

그리고 처음에는 매직넘버를 #!/bin/bash에 넣어준다. 그 다음 cat의 위치를 알아내어 

아래처럼 수정한다. 

 

각각 cat의 위치와 bash의 위치가 보인다

이 magic number를 이용해보겠다.

 

=> 이런 식으로 실행하는 프로그램을 수정할 수 있다. 

즉 만약 #!/bin/bash라고 적혀있다면  bash셸을 사용해서 이 프로그램을 작성한 것이다 라고 명시해주는 것이다. 

 

=======================================================================================

 

 

변수의 입력과 출력 

 

 

first.sh에 위와 같이 작성한 후 실행한 장면이다

 

 

$," "는 변수를 인식하는 반면 ' ', \는 문자로 인식하여 적은 그대로 나온다. 

read 명령어의 경우 내가 작성한 대로 출력을 해주기 때문에 커서가 있다. 

abc라고 적었더니 abc로 바뀐 것을 알 수 있다. 

 

==========================================================================

 

숫자 계산 

 

이 코드는 pwd 명령어에 대한 결과를 출력해준다는 의미이다. 

이것과 똑같은 것이 ` ` 이다 ''가 아니라 쿼터이다

똑같이 나온다

 

numcalc.sh 파일에 위와 같이 작성을 해주고 chmod 755로 권한을 변경하였다. 

★여기서 expr은 띄어쓰기에 주의해야하고 괄호와 *는 \와 같이 써줘야 한다. 

실행했을 경우 다음과 같이 결과가 나왔다. 그냥 $num1+200으로 한 경우 문자로 인식하기 때문에 

연산을 하지 못한다. 

 

==========================================================================

 

파라미터 변수 

 

  • 파라미터 변수는 $0 , $1, $2 의 형태를 가진다
  • 전체 파라미터는 $*로 표현한다 

 

명령어 yum -y install gftp
파라미터 변수 $0 $1 $2 $3

 

echo $0의 경우 실행파일의 이름이 출력되나 그래서 -bash가 나온다

vi parvar.sh로 위와같이 적어서 실행할 경우 현재 실행파일인 ./parvar.sh만 나온다

나머지는 존재하지 않아 출력되지 않는다

 

하지만 이렇게 파라미터를 준다면 출력할 수 있다

 

 

=========================================================================

 

기본 IF문 

 

형식 if [조건] then                                                                       ※[조건]의 사이의 각 단어엔 모두 공백이 있어야 함    참일 경우 실행fi ==문장의 끝 

 

vi if.sh를 통해 위의 그림처럼 적어주고 

vi if.sh && chmod 755 if.sh 

=> 이것은 먼저 if.sh를 만들어주고 그다음 이어질 명령어를 &&로 이어 권한을 바꿔준다. 

755로 바꿨기 때문에 실행할 수 있다.

 

 

if ~ else문

if [ 조건 ] 

then 

참 일 경우 실행 

else 

거짓을 경우 실행 

fi 

 

조건문에 들어가는 비교 연산자

== 문자열 같으면 참  != 같지 않으면 참

-n "문자열" 문자열이 null(빈 문자열)이 아니면 참 

-z "문자열" 문자열이 null(빈 문자열)이면 참 

 

if [ -n "" ]이렇게 대괄호안에 넣어준다. 

 

 

산술비교 

 

산술비교 결과
수식 1 -eq 수식 2 같으면 참
수식 1 -ne 수식 2 같지 않으면 참
수식 1 -gt 수식 2 1이 크다면 참
수식 1 -ge 수식 2 1이 크거나 같으면 참
수식 1 -lt 수식 2 1이 작으면 참
수식 1 -le 수식 2 1이 작거나 같으면 참
!수식 수식이 거짓이면 참 

 

 

====================================================================

 

파일과 관련된 조건 

 

파일 조건 결과
-d 파일이름 파일이 디렉토리면 참
-e 파일이름 파일이 존재하면 참
-f 파일이름 일반파일이면 참
-g 파일이름 set-group-id가 설정되면 참
-r 파일이름 읽기 가능이면 참
-s 파일이름 크기가 0이 아니면 참
-u 파일이름 set-user-id가 설정되면 참
-w 파일이름 쓰기 가능이면 참
-x 파일이름 실행가능이면 참

 

-f의 사용예시 

파일이름을 주고 이 파일이 일반파일인지 아닌지를 보는 것이다

만약 일반 파일이라면 위에서부터 5줄을 출력해주고 

아니라면 "/etc/passwd is not exist"를 출력해준다. 

 

참이기 때문에 위와 같이 출력된다. 

 

============================================================================

 

case ~ esac문 

 

이번엔 vi가 아닌 vim을 통해 본다

해석해보자면 $1의 값이 start인 경우, stop인 경우, restart인 경우 *(그 외) 인경우 각각 출력문을 담고 있다

 

이렇게 사용할 수 있다. 

 

YES OR NO 

.

read는 입력하는 명령어이다 

[nN]*)의 경우 n혹은 N뒤로 오는 모든 단어를 의미한다. 

 

 

And OR 관계자 

 

and 는 -a 또는 && 사용

or 는 -o 혹은 || 사용 

 

-f, -s를 사용하여 일반 파일인지 빈파일인지도 검사할 수 있다. 

 

=====================================================================================

 

for문 

 1부터 10까지 더하는 식이다

그러나 1부터 10까지 표현하는 것은 노가다이기 때문에 다른 여러 방식으로 표현할 수가 있다. 

 

 

이렇게 {1..10} 표현 가능하다

만약 {1..10..2}이렇게 표현한다면 1부터 10까지 2씩 증가하면서 늘어난다는 것을 의미한다.

 

예번에는 seq 라는 명령어를 주었다. 

만약 seq1 10이라면 1부터 10까지를 출력한다

 

만약 seq 1 2 10이라면 1부터 2씩 증가하면서 10까지 늘어난다. 

이 식을 for i in ${seq 1 10} 이런 식으로 작성한다. 

 

이 때 for i in * 처럼 모든 파일에 대해서도 호출이 가능하다 따라서 

/root/*와 같은 조건도 넣을 수가 있다.

 

숨긴파일까지 호출하려면 /root/.*로 .을 넣어줘야 한다

/root/*/root/.*로 숨김파일과 일반 파일을 둘 다 호출할 수도 있다. 

 

이렇게 명령어를 넣어서도 출력할 수 있다. 

 

배열 

 

배열의 경우 다음과 같이 쓴다. 

 

이중괄호

흔한 for문이다 

여기서 무한루프도 사용할 수 있다

 

for (( ;; ))로 무한 루프를 주고 

sleep 1로 1초지연시킨다. 

 

 

💨간단한 프로그램 작성 

 

20을 입력하면 프로그램이 종료되는 프로그램 작성 

 

read로 value값을 받아온다

반드시 변수값을 받을 때는 " "로 묶어줘야 문자로 인식한다.

break로 종료를 해준다. 

 

728x90