2022. 11. 24. 01:53ㆍ리눅스(Linux)
shell이란?
- 참고자료 -
https://taehei43.tistory.com/30
What is Shell Script
- 명령어를 조합하는 방법으로 프로그램을 만들 수 있도록 한다.
- DOS에서의 Batch 파일 작성과 유사하다
$ Shell Script 의 장점
- 리눅스 명령 및 환경 변수 등을 사용 할 수 있다.
- Pipe, Redirection, Filter 등
- C 프로그램과 유사한 형태의 프로그래밍이 가능하다.
• 사용자 정의 함수 생성
• 각종 Loop문 사용
$ Shell Script
- 명령어가 명령 행에서가 아니라 파일 안에서 실행될 때, 이 파일을 쉘 스크립트라 한다.
- Shell Script는 일반적으로 편집기에서 작성하며, 그 내용은 주석과 명령어로 구성되어 있다.
첫번째 행
#!/bin/bash
- 스크립트의 첫번째 행은 스크립트를 사용할 때 사용할 Shell 의 이름을 적는다.
- 기호 #!는 maginc number라 불리며, 커널이 실행 프로그램으로 인식해야 하는지
여부를 알려주기 위해 사용한다.
주석
- 주석은 파운드 기호(#)가 앞서 나오는 행을 말한다.
- 적절한 주석을 사용하여야 스크립트가 어떻게 작동하는지 추후에도 알 수 있다.
실행문과 Bash shell의 구조
- Bash shell 프로그램은 유닉스 명령어, Bourne shell 명령어, 프로그램 구조, 주석 등으로 이루어져 있다.
스크립트에 실행 권한 부여
- 스크립트를 실행하려면 적절한 실행 권한을 주어야 한다.
$ Linux Bash ShellScript 제어문 연산자
조건 | 설명 |
-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 | 함수를 호출한 곳으로 되돌아 가고자 할 때 사용 |
$ 스크립트 내용 및 실행 예제
#! /bin/bash
# 이 프로그램의 Bash Shell Program의 첫 번째 예제 입니다.
# 스크립트의 이름 : test
# 작성자 : 김진홍 (firefox@xcurelab.com)
echo "안녕하세요 $LOGNAME 님 오늘하루도 좋은 시간 보내세요."
echo "당신의 현재 작업 디렉토리는` `pwd`` 입니다."
echo "당신이 작업하고 있는 컴퓨터의 이름은 `uname -n` 입니다."
echo -e "다음은 현재 당신의 작업 디렉토리에 있는 파일의 목록입니다." \\n
ls # 현재 위치의 파일 목록 출력
echo "$LOGNAME 님 안녕히 가세요. 현재시간은 `date +%T`! 입니다."
# . test.sh
안녕하세요 root 님 오늘하루도 좋은 시간 보내세요.
당신의 현재 작업 디렉토리는 /root 입니다.
당신이 작업하고 있는 컴퓨터의 이름은 localhost.localdomain 입니다.
다음은 현재 당신의 작업 디렉토리에 있는 파일의 목록입니다.
Desktop anaconda-ks.cfg install.log install.log.syslog ks.cfg
test.sh
root 님 안녕히 가세요. 현재시간은 16:19:09! 입니다.
사용자 입력 읽기
$ read 명령어
# read ; echo -e 입력값 테스트 : \\n:$REPLY
test
입력값 테스트 :
test
- read 명령어는 개행문자가 나타날 때까지 행을 읽어 들인다.
- 입력 받은 내용을 저장한 특별한 이름을 지정하지 않으면, REPLY라는
특수 내장변수에 값을 저장한다
# read test ; echo 특정 변수에 입력 받기 입력값은 $test
read 문 연습
특정 변수에 입력 받기 입력값은 read 문 연습
- read 명령어를 이용하여 test 라는 변수에 값 입력하기
$ if ~ else문
- 조건을 표현하기 위한 가장 간단한 형태
if [ 조건 1 ]; then
"조건 1이 참일 경우 실행 할 내용"
elif [ 조건 2 ]; then
"조건 2가 참일 경우 실행 할 내용"
else
"모든 조건이 거짓일 경우 실행 할 내용"
fi
- " [ " 앞 뒤로 반드시 공백이 존재해야 된다.
- if 다음에 나오는 배시의 내장 명령어나 유니스 유틸리티들은 실행되고
나서 종료 상태값을 반환한다.
- 종료 상태값이 0이면 명령어가 성공적으로 수행되었음을 의미
if grep "$name" /etc/passwd > /dev/null 2>&1
then
echo Found $name!
fi
name=test
if grep "$name" /etc/passwd 2>&1
then
echo Found $name !!
fi
$ 숫자 계산
- Shell Script에서 숫자의 계산은 expr을 사용한다.
#! /bin/bash
num=`expr 2 + 10 - 4`
echo $num
- expr 숫자 연산
$ case 문
case 조건 in
조건 1 )
“조건 1이 참일 경우 실행 할 실행문”;;
조건 2 )
“조건 2가 참일 경우 실행 할 실행문”;;
* )
“조건 1, 조건 2가 참이 아닐 경우 실행 할 실행문”;;
esac
- 실행문의 끝지점에는 반드시 “;;“(세미콜론) 2개를 명시한다.
$ select 문
select 변수 in [ 항목1 항목2 항목3 .. ]
do
“항목이 유효 할 경우 실행 할 실행문”
done
- select 제어문의 경우 메뉴 구성 시 주로 사용된다.
$ for 문
- 조건 반복문으로 일반적인 다른 프로그래밍 언어의 형태와는 약간 다르다.
for 변수 in 인자1, 인자2, 인자3 … [ 방법.1 ]
for (( 초기값;종료값;증감값 )) [ 방법.2 ] ( ★ )
do
“반복하며 실행 할 실행문”
done
- 일반 C언어 형식을 사용 할 경우 반드시 괄호가 2개 들어가야하며, 앞뒤 공백이 들어가야 한다.
$ while 문
- for문과 마찬가지로 조건문이 참임 경우에는 반복하여 실행한다.
while [ 조건 ]
do
“조건이 만족하는 동안 반복하며 실행 할 실행문”
done
- if 와 for문을 합쳐놓은 형태
echo -n "숫자를 입력하세요 : "
read _num
while [ $_num -gt 5 ]
do
echo "입력하신 숫자가 5보다 큽니다."
done
- 입력값이 지정된 값보다 크거나 같은경우 무한루프 시키기
$ until 문
- while 문과 같은 반복문이지만 반대로 동작한다.
- 주어진 조건이 참이될 때 까지만 반복
until [ 조건문 ]
do
“조건이 만족할 때 까지만 반복하여 실행 할 실행문”
done
- until문의 형식
until [ 1 ]
do
echo "Hackers College Education"
done
- 참인 조건
$ functon
function 함수명( ) {
“함수 내부에서 실행 할 실행문”
}
함수명 # 함수 호출
- 함수 정의 후 해당 함수를 실행하기 위해서는 반드시 호출작업이 진행되어야 한다.
- 원하는 시점에 원하는 함수가 실행 되어야 한다.
$ ETC
1. [ eval ]
- 특정 명령어를 변수로 저장하고 원하는 시점에 실행 될 때 사용 된다.
- EX) str=“ls -l /home”
eval $str
2. [ set, unset ]
- 특정 변수 할당 및 할당 해제시 주로 사용된다.
- 에러 발생 시 ShellScript를 즉시 종료하는 용도로 주로 사용 ( set -e )
3. [ $(명령어) ]
- 특정 명령어를 즉시 실행 할 때 주로 사용된다.
[root@Linux-01 shell]# PS1="[\u@\h][\T][\W]\$"
[root@Linux-01][10:30:06][shell]$
[root@Linux-01 shell]# echo $PS1
[\u@\h \W]\$
- PS1 디폴트 값 확인
[root@Linux-01 shell]# SAVE=$PS1
- SAVE 변수에 PS1 백업
[root@Linux-01 shell]# echo $SAVE
[\u@\h \W]\$
- SAVE 변수값 확인
[root@Linux-01 shell]# PS1="[\u@\h][\T][\W]\$"
- PS1 형식 변경
[root@Linux-01][10:30:06][shell]$PS1=$SAVE
- 백업해뒀던 SAVE 불러와서 초기상태로 되돌림
# vi ./cale.sh
#!/bin/bash
echo -n "Num1 Input: "
read num1
- 줄바꿈 안하는 옵션(-n), “Num1 Input: ”출력
- sacnf 랑 같음, num1 변수 선언
echo -n "Num2 Input: "
read num2
echo "Sum: `expr $num1 + $num2`"
echo "Sub: `expr $num1 - $num2`"
echo "Mul: `expr $num1 \* $num2`" → * 이거만쓰면 명령문을 인식안함
echo "Div: `expr $num1 / $num2`"
echo "Mod: `expr $num1 % $num2`"
echo "Ret: `expr \( $num1 + $num2 \) / $num1`"
- 형식 잘 지켜야함
# chmod +x ./cale.sh
- 스크립트 실행권한 부여
# ./cale.sh
- 스크립트 실행
# vi ./arg.sh
#!/bin/bash
readonly text="Hello Shell Scripts"
echo $text
echo -n "input name, age, addr: "
read name age addr
printf "%s\n" "$name"
printf "%s\n" "$age"
printf "%s\n" "$addr"
echo "실행 중인 스크립트의 파일명: [$0]"
echo "첫 번째 인차값: $1"
echo "두 번째 인차값: $2"
echo "세 번째 인차값: $3"
echo "모든 번째 인차값: $*"
# chmod +x ./arg.sh
# ./arg.sh
# ./arg.sh A B C
- 인자값 입력 후 실행
# vi ./arr.sh
#!/bin/bash
arr1=("s1" "22" "Seoul")
- 배열을 묶을 때 ()를 사용해야한다.
- 구분자는 띄어쓰기로 한다, 다른구분자는 사용하지 않는다
arr2[0]="s2"
arr2[1]="30"
- 데이터의 순서 번호(인덱스 번호)를 넣어줘야 한다.
echo ${#arr1[@]}
echo ${#arr2[@]}
- 배열 갯수 출력
- 배열을 지정할때는 ${}를 사용
- [@] : arr group @는 배열 그룹을 의미, 전체 데이터를 선택하는 행위
printf "%s\n" "${arr1[@]}"
- arr1 전체 데이터를 출력
echo ${arr2[0]}
echo ${arr2[1]}
# chmod +x ./arr.sh
# vi ./arr.sh
# ./arr.sh
'리눅스(Linux)' 카테고리의 다른 글
[Centos 7] Linux Crond & Crontab (시스템 예약 작업 크론 ) (0) | 2022.11.24 |
---|---|
[Centos 7] Shell Script 예제 (0) | 2022.11.24 |
[Centos 7] Tar, Gzip and Bzip (압축 도구들) (0) | 2022.11.24 |
[Centos 7] YUM (Yellowdog Updater Manager) (0) | 2022.11.23 |
[Centos 7] RPM (Redhat Package Manager) (0) | 2022.11.23 |