■ 7. 쉘스크립트 작성법
→ 쉘shell 이란 무엇인가?
"shell 이란 운영체제에서 제공하는 명령을 실행하는 프로그램이다."
→ 쉘shell 스크립트란?
"인터프리터(통역사) 역할을 하는 것으로 시스템에서 지원하는 명령어들의
집합을 묶어서 프로그램화한것을 말한다."
→쉘shell 의 종류
1. Bourne shell
2. C shell
3. Korn shell
4. bash shell
예:
#!/bin/bash ------>쉘중에 bash shell 을쓰겠다는 뜻 !
*1,2,3의 장점을 다 살려놓은게 bash shell !
→쉘 스크립트 프로그래밍이란?
1. C 언어와 유사한 프로그래밍
2. 변수, 반복문(loop문), 제어문(if문) 이 사용가능
3. 별도로 컴파일 하지 않고 텍스트 파일 형태로 바로 실행이 가능하다.
*C나 자바는 컴파일해줘야 한다.(기계가 알 수 있는 언어로 바꿔줘야 한다)
4. vi 나 gedit 으로 작성이 가능
5. 리눅스의 많은 부분이 쉘스크립트로 작성이 되어있다.
■ 쉘 스크립트를 작성하고 실행하는 방법
$ vi a.sh
echo "host name:" $HOSTNAME
$ sh a.sh
[orcl:~]$ sh a.sh
host name: edydr1p0.us.oracle.com
이렇게 호스트네임 볼 수도 있구요
$ vi a.sh
echo "yahoo~~"
[orcl:~]$ sh a.sh
yahoo~~~
***./a.sh 로 하려니까 실행권한 없다고 뜬다(왜 하려고 했는지는 모름)
[orcl:~]$ ls -l a.sh
-rw-r--r-- 1 oracle oinstall 17 Dec 20 11:39 a.sh
***보면 실행권한 x가 없는걸 볼 수 있다.
문제127.
a.sh 에 소유자가 실행할 수 있도록 실행권한을 넣으시오
[orcl:~]$ chmod u+x a.sh
[orcl:~]$ ls -l a.sh
-rwxr--r-- 1 oracle oinstall 17 Dec 20 11:39 a.sh
[orcl:~]$ ./a.sh
yahoo~~~
※ 설명:
./파일명 으로 실행하려면 실행권한이 있어야 한다.
sh 파일명 .sh 는 파일의 실행권한이 없어도 실행된다.
****최상위계정 root 로 들어가서 권한설정하는 경우는
oracle 같은 하위 계정사용자에게 제한을 걸때 한다.
■ 변수 사용법
1. 모든 변수는 "문자열(string)" 으로 취급된다.
2. 변수 이름은 대소문자를 구분한다.
3. 변수에 값을 대입할 때는 '=' 좌우에 공백이 없어야 한다.
4. 변수에 들어간 문자를 출력하려면 변수 앞에 $ 를 붙이고
echo 명령어로 출력하면 된다.
예:
[orcl:~]$ myvar="hi~~~~~~~~~~~"
[orcl:~]$ echo $myvar
hi~~~~~~~~~~~
■ 변수의 숫자 계산하는 방법
1. 변수에 대입한 값은 모두 문자열로 취급된다.
2. 변수에 들어있는 값을 숫자로 해서 + * / - 등의 연산을 하려면
띄어쓰기랑 expr 을 사용해야 한다.
3. 수식에 괄호 또는 곱하기(*)를 사용하려면
그 앞에 반드시 역슬래시(\) 를 붙여야한다.
예제:
[orcl:~]$ num1=100
[orcl:~]$ num2=200
[orcl:~]$ echo $num1
100
[orcl:~]$ echo $num2
200
[orcl:~]$ echo $num1+$num2
100+200
[orcl:~]$ expr $num1 + $num2
300
※계산하는 expr 은 +사이에 띄어쓰기 해줘야 각각의 변수로 이해하고 연산한다.
(붙여쓰면 하나의 문자로 인식)
문제128.
num1 과 num2 의 곱을 구하시오
※3. 수식에 괄호 또는 곱하기(*)를 사용하려면
그 앞에 반드시 역슬래시(\) 를 붙여야한다.
[orcl:~]$ expr $num1 \* $num2
20000
문제129.(점심시간 문제)
아래의 계산식을 구현하시오!
($num2 + 200) * $num1
[orcl:~]$ expr \( $num2 + 200 \) \* $num1
40000
※괄호앞뒤로 역슬래쉬, 곱셈앞에 역슬래쉬
■ 파라미터 변수
1. 파라미터 변수는 $0, $1, $2 .. 이 형태를 가진다.
2. 전체 파라미터는 $* 로 표현한다.
예제:
$ vi b.sh
echo "실행파일 이름은 $0 입니다"
echo "첫번째 파라미터 값은 $1 입니다"
echo "두번째 파라미터값은 $2 입니다"
echo "전체 파라미터값은 $* 입니다"
[orcl:~]$ vi b.sh
[orcl:~]$ sh b.sh 10 20
실행파일 이름은 b.sh 입니다
첫번째 파라미터값을 10 입니다
두번째 파라미터 값은 20 입니다
전체 파라미터 값은 10 20 입니다.
※설명:
[orcl:~]$ sh b.sh 10 20
↑ ↑ ↑
$0 $1 $2 **전체는 $*
문제130.
아래와 같이 두 정수를 파라미터 값으로 입력했을 때
나눈 나머지 값이 출력되게 하시오
[orcl:~]$ vi f.sh
[orcl:~]$ sh f.sh 24 18
24 plus 18 and 42
※ 설명:
변수=`리눅스 명령어`
리눅스 명령어에 의해서 수행된 결과가 변수에 입력되어야 한다면
역따옴표를 사용해야 한다
문제131.
아래의 두 수를 각각 물어보게하고 아래의 두 수를 곱한 결과가
출력되게 하시오
$ sh two_number.sh 12 54
[orcl:~]$ sh two_number.sh 12 54
12 and 54 is 648
■ 리눅스 쉘에서 if 문 사용방법
if [ 조건 ]; then
실행문
elif [ 조건 ]; then
실행문
else
실행문
fi
※ 4칸 안띄어도 되고, 마지막 닫을 땐 fi 로 거꾸로 쓴다.
※ if 문 사용시 주의 사항 ! "공백처리를 잘해줘야한다."
■ if 문 조건문에 들어가는 비교 연산자
-문자열 비교
1. "문자열1"="문자열2" : 두 문자열이 같으면 true
2. "문자열1"!="문자열2": 두 문자열이 같지 않으면 true
-숫자열 비교
1. 숫자1 -eq 숫자2 : 두 숫자가 같으면 true (참 판정)
2. 숫자1 -ne 숫자2 : 두 숫자가 같지 않으면 true (거짓판정)
3. 숫자1 -gt 숫자2 : 숫자 1이 숫자 2보다 크다면 true (왼쪽 크면 참)
4. 숫자1 -ge 숫자2 : 숫자 1이 숫자 2보다 크거나 같다면 true (왼쪽 크거나 같으면 참)
5. 숫자1 -lt 숫자2 : 숫자 1이 숫자 2보다 작다면 true
6. 숫자1 -le 숫자2 : 숫자 1이 숫자 2보다 작거나 같으면 true
7. !숫자1
-비교 표현식 줄임말
eq - equal ( = )
ne - not equal ( <> )
lt - little ( < )
le - little or equal ( <= )
gt - greater ( > )
ge - greater or equal ( >= )
예제:
$ vi if1.sh
#!/bin/bash
if [ 100 -eq 200 ]; then
echo 100과 200은 같다
else
echo 100과 200은 같지않다
fi
[orcl:~]$ sh if1.sh
100과 200은 같지않다
문제132.
위의 스크립트를 파라미터 변수를 이용해서
아래와 같이 실행될 수 있게 하시오
$ sh if1.sh
$ vi if1.sh
[orcl:~]$ sh if1.sh 100 200
100과 200은 같지않다
문제133.
아래와 같이 실행되게 쉘스크립트를 작성하시오
$ sh if2.sh 100 200
$ sh if2.sh 100 200
$ sh if2.sh 200 100
$ sh if2.sh 100 100
■ 리눅스에서 사용하는 연산자
※ 리눅스의 연산자 3가지
1. 산술 연산자: + , -, *, /
2. 비교 연산자: >, <, >=, <=, ==, !=
3. 논리 연산자: &&, ||, !
논리 연산자인 and 는 && 또는 -a 를 사용한다.
논리 연산자인 or 는 || 또는 -o 를 사용한다.
eq - equal ( = )
ne - not equal ( <> )
lt - little ( < )
le - little or equal ( <= )
gt - greater ( > )
ge - greater or equal ( >= )
예제:
if [ $sal -lt 2000 ] && [ $job=="SALESMAN" ]; then
또는
if [ $sal -lt 2000 -a $job=="SALESMAN" ]; then
문제134.
아래와 같이 쉘스크립트를 실행하면 아래와 같은 결과가 출력되게 하시오!
$ sh find_sal.sh scott
scott 의 월급은 3000 입니다
$ vi find_sal.sh
sal=`grep -i $1 emp.txt | awk '{print $6}'`
echo $1 s salary is $sal
[orcl:~]$ sh find_sal.sh scott
scott salary is 3000
문제135.
아래와 같이 실행했을 때 해당 사원의 부서번호가 30번이고
월급이 2000 보다 작다면
"월급 인상 대상자 입니다"
라는 메시지가 나오게 하고
그렇지 않으면
"월급 인상 대상자가 아닙니다" 라는 메시지가 나오게 하시오
결과:
$sh find_sal.sh scott
월급 인상 대상자가 아닙니다
$ sh find_sal.sh martin
월급 인상 대상자 입니다
$ vi find_sal.sh
다른 if문
if [ $deptno -eq 30 -a $sal -lt 2000 ]; then
[orcl:~]$ sh find_sal.sh scott
this person is being same salary
[orcl:~]$ sh find_sal.sh martin
this person needs ascending salary
■ loop 문
*for loop 문 문법
for 변수 in {값1,값2,값3}
do
반복할 문장
done
예제:
$ vi for.sh
hap=1
[orcl:~]$ sh for.sh
from 1 to 10 plus is 55
문제136.
위의 코드를 수정해서 구구단 2단을 출력하시오!
$ vi for2.sh
[orcl:~]$ sh for2.sh
2x1=2
2x2=4
2x3=6
2x4=8
2x5=10
2x6=12
2x7=14
2x8=16
2x9=18
문제137.
구구단 2단부터 9단까지 출력하시오!
$ vi for2.sh
문제138.
아래의 별표를 출력하시오
$ sh star.sh
@
파이썬 처럼 문자와 숫자의 곱으로 생각하면 안됨.
빈 변수에다 넣어서 나열한다고 생각해야 됨.
[orcl:~]$ sh star.sh
@
@@
@@@
@@@@
@@@@@
■ eval
"eval 명령어는 문자열을 명령문으로 인식하고 실행하는 명령어"
예:
$ eval echo {1..10}
1 2 3 4 5 6 7 8 9 10
**변수를 끌어와서 명령문으로 인식시키려면
num=6
for i in `eval echo { 1..$num}`
문제139.
위의 코드를 수정해서 숫자를 물어보게하고
숫자를 입력하면 해당 숫자만큼 @ 가 출력되게 하시오!
$ vi star2.sh
숫자를 입력하세요~ 6
[orcl:~]$ sh star2.sh
put your number in here: 6
@
@@
@@@
@@@@
@@@@@
@@@@@@
문제140.(오늘의 마지막 문제)
숫자를 물어보게 하고 아래와 같이 결과가 출력되게 하시오
$ sh star2.sh
힌트: for ((i=10; i>0; i--))
do
echo $i
done
**힌트 사용한거
**힌트 사용 안하고 기존 방법
[orcl:~]$ sh star2.sh
put your number in here: 6
@@@@@@
@@@@@
@@@@
@@@
@@
@
echo -n "put your number in here: "
read num
star=""
for i in `eval echo {$num..1}`
do
for j in `eval echo {$i..1}`
star="$star@"
done
echo $star
star=""
done
'linux' 카테고리의 다른 글
7-2.쉘스크립트 while문 (1) | 2019.04.03 |
---|---|
7-1.쉘스크립트 for문 (0) | 2019.04.03 |
6. 프로세서 관리 (0) | 2019.04.03 |
디스크 관리[df,du,sar,한글 input, 리눅스 str] (0) | 2019.01.02 |
권한관리[chmod,chown.chattr,권한관리 단축키, 단축어, root, chattr +i, whatis chmod] (0) | 2019.01.02 |