Linux - ShellScript
ShellScript
- Shell이란 유닉스 리눅스 환경의 대화형 사용자 인터페이스를 말한다.
- 사용자가 입력하는 명령어를 이해하고, 실행하는 역할을 한다.
- 운영체계의 바깥 계층에 위치하며, 사용자와 커널의 의사소통을 담당.
- cshell, bourneshell, bashshell, tcshell, kornshell, 등 다양한 종류가 있다.
[ 지역 변수 ]
자신을 생성한 Shell에서만 사용할 수 있다.
지역변수 선언
# A="hann"
# declare B="HANN"
declare는 지역변수 선언을 의미
[ 환경 변수 ]
자신을 생성한 Shell뿐만 아니라, 이로부터 파생되어 나온 자식 프로세스에서도 사용할 수 있다.
환경변수 선언
# export NAME="Kim Tistory"
# declare -x TEST="Shell" (-x 를 붙이면 declare도 환경변수가 된다.)
[ 변수 명칭 표준 ]
변수 이름에는 알파벳 “a~z”, “A~Z”, “0~9”, 언더스코어( _ )로 이루어진 총 63개의 문자를
사용 할 수 있으며, 변수명의 첫 글자는 반드시 알파벳 혹은 밑줄문자 ( _ )이어야 한다.
[ 변수에 값 할당하기 ]
등호( = )를 사용하며, 등호( = ) 양쪽에는 공백이 올 수 없다
[ 출력 ]
# echo $A
# echo $B
# echo $NAME
# echo $TEST
환경변수 출력
env, printenv, export 등의 방법이 있다.
# export
스크립트 작성을 완료했으면 실행 파일로 만들어줘야한다.
x권한을 추가해주자.
# chmod +x ./test1.sh
스크립트 실행
# ./test1.sh
# SAVE=$PS1
# echo $SAVE
[\u@\h \W]\$ 이정보는 PS1이라는 시스템환경변수에 저장된 내용이며
[root@localhost] # 이걸 의미
변경해보기
# PS1="[\T]$SAVE"
다시 복구
# PS1=$SAVE
# var1="Hello Shell"
# var2="Hello"
# echo $var1
# echo "$var1"
쌍따옴표를 한것과 안한것의 출력결과는 같다.
홑따옴표를 사용하면
# echo '$var1'
홑따옴표안의 내용을 그대로 출력. 즉 일반문자 취급을 하게된다.
배열만들기
# vi ./arr.sh
#!/bin/bash
arr=("Kim" "Jun" "Hyun")
echo ${#arr[@]} 배열 전체 출력 @는 배열전체를 뜻한다.
#을 붙이면 요소 개수를 출력하라는 의미.
printf "val=%s\n" "${arr[@]}" 배열을 출력하는 문장. @는 전체를 출력.
@대신에 인덱스번호를 입력하면 해당
인덱스자리 출력.
VAL[0]="TEST1"
VAL[1]="TEST2"
VAL[2]="TEST3"
echo ${VAL[0]}
echo ${VAL[1]}
echo ${VAL[2]}
저장하고 나와서
# chmod +x ./arr.sh
# ./arr.sh
Bash Shell Script 제어문 연산자
조건 | 설명 |
-d “디렉터리명” | 디렉터리가 존재 할 경우 참 |
-e “파일명” | 파일이 존재 할 경우 참 |
-f “파일명” | 일반 파일 일 경우 참 |
-s “파일명” | 파일의 크기가 0이 아니면 참 |
-r “파일명” | 읽기 권한이 있는 파일이면 참 |
-w “파일명” | 쓰기 권한이 있는 파일이면 참 |
-x “파일명” | 실행 권한이 있는 파일이면 참 |
-u “파일명” | Set-UID 특수권한이 설정이 되어있을 경우 참 |
-z “변수명” | 지정 한 변수가 없는 경우를 의미 ( ! )와 유사 |
비교 연산 | 설명 |
[ $a –eq $b ] | a 변수와 b변수는 같다 ( Equal ) |
[ $a –ne $b ] | a 변수와 b변수는 같지 않다 ( Negation ) |
[ $a –gt $b ] | a 변수가 b변수보다 크다 ( Greater then ) |
[ $a –lt $b ] | a 변수가 b변수보다 작다 ( Less then ) |
[ $a –ge $b ] | a 변수가 b변수보다 크거나 같다 ( Greater Equal ) |
[ $a –le $b ] | a 변수가 b변수보다 작다 ( Less Equal ) |
[ $string1 == $string2 ] | String1이 String2와 같다 |
[ $string1 != $string2 ] | String1이 String2와 다르다 |
논리 연산 | 설명 |
[ $A && $B ] | A와 B가 모두 참이어야 참 ( AND ) |
[ $A || $B ] | A와 B둘 중 하나만 참이어도 참 ( OR ) |
기타 제어문 | 설명 |
break | 특정 실행 Loop에서 벗어나고자 할 때 사용 |
continue | 특정 실행 Loop에서 조건식으로 이동하고자 할 때 사 용 |
exit | 스크립트 종료시 사용 |
return | 함수를 호출한 곳으로 되돌아 가고자 할 때 사용 |
if문
첫번째 예시
#cd /root/script
# vi ./if_test1.sh
# chmod +x ./if_test1.sh
# ./if_test1.sh
Enter Is Command Path: /root/script/if
File Not Found 찾고자하는 파일의 경로와 파일명 입력
# ./if_test1.sh
Enter Is Command Path: /root/script/if_test1.sh
File location: /root/script/if_test1.sh
----------------------------------------------
if문
두번째 예시
# vi ./if_test2.sh
# chmod +x ./if_test2.sh
# ./if_test2.sh
----------------------------------------------
if문
세번째 예시
# vi ./if_test3.sh
# chmod +x ./if_test3.sh
# ./if_test3.sh
----------------------------------------------
if문
네번째 예시
# vi ./if_test4.sh
# chmod +x ./if_test4.sh
# ./if_test4.sh
# vi ./case_test1.sh
----------------------------------------------
case문
두번째 예시 파라미터 값 이용
# vi ./case_test2.sh
실행
파라미터 값 입력
# ./case_test2.sh 100 200
----------------------------------------------
case문
세번째 예시
# vi ./case_test3.sh
실행
# ./case_test3.sh car
select문
첫번째 예시
# vi ./select_test1.sh
실행
# ./select_test1.sh 원하는 번호 입력. 종료는 ctrl+c
이제 디렉터리를 하나 만들고 다시 해보면 디렉터리라고 알려준다
# mkdir ./test
이제 해당 스크립트가 없는곳으로 경로를 이동해보자
# cd ~
그리고 실행
# /root/script/select_test1.sh
그리고 만들어준 디렉터리를 다시 실행해보면 디렉터리를 파일이라고 출력한다.
select문은 해당 스크립트가 없는 곳으로 이동해서 실행시키면
파일과 디렉터리를 구분하지 못하는 한계가 있다.
----------------------------------------------
select문
두번째 예시
보통 select문과 case문은 함께 쓰인다
# vi ./select_test2.sh
for문
첫번째 예시
# vi ./for_test1.sh
for문은 스크립트가 아닌 프롬프트 창에서도 가능하다.
# for cnt in {1..10..1}; do echo $cnt; done
----------------------------------------------
for문
두번째 예시
# vi ./for_test2.sh
----------------------------------------------
for문
세번째 예시
# vi ./for_test3.sh
----------------------------------------------
for문
네번째 예시
# vi ./for_test4.sh
----------------------------------------------
for문
다섯번째 예시
# vi ./for_test5.sh
while문
첫번째 예시
# vi ./while_test1.sh
----------------------------------------------
while문
두번째 예시
# vi ./while_test2.sh
----------------------------------------------
while문
세번째 예시 -- 가상머신에서 firefox 틀어놓고 진행
# vi ./while_test3.sh
# ./while_test3.sh
Input Apps Name: firefox
함수
첫번째 예시
# vi ./function_test1.sh
----------------------------------------------
함수
두번째 예시
# vi ./function_test2.sh
----------------------------------------
함수
세번째 예시
# vi ./function_test3.sh
eval 예시
# vi ./eval.sh
------------------------------------------------------------------------------------
set예시
같은연결 hann 로그인
$ vi ./set_test.sh
#!/bin/bash
echo "Before Error"
cd /root 일반사용자 계정으로 로그인 했지만 root로 이동하겠다는 에러가 발생하는 문구
echo "After Error"
실행시켜보면
허가거부 메세지가 나타나지만
그아래에
echo "After Error"가 나타난다. 즉 에러가 발생해도 나머지것들을 정상적으로 실행하는 것을 알 수 있다.
#!/bin/bash
set -e echo "Before Error" set -e 를 추가
cd /root
echo "After Error"
다시 실행시켜보면
이번에는 허가거부가 나타나면서 다른 작업을 진행하지 않은 것을 알 수 있다.
--------------------------------------------------
unset 예시
# export My="Hello Word"
# echo $My
# unset My unset할때는 $빼고 입력
# echo $My
--------------------------------------------------
$ 예시 즉시실행.
# vi ./command.sh
# chmod +x ./command.sh
# ./command.sh
작성해준 명령이 즉시 실행된다.
여기까지 ShellScript 에 대한 설명이 끝났다.