셸 스크립트 프로그래밍
- 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로 종료를 해준다.