728x90
반응형
출처 : https://www.youtube.com/watch?v=OYly7irfmBc&list=PLVsNizTWUw7FqN2gq79Cb3R6qkS7mqOJk&index=46
변수의 입력과 출력
- $ 문자가 들어간 글자를 출력하려면 ' '로 묶어주거나 앞에 \를 붙여야 한다.
- " "로 변수를 묶어줘도 된다.
#!/bin/sh
myvar="Hi Woo"
yourvar="Hi Zang"
echo $myvar 1
echo "$yourvar 2"
echo '$myvar 3'
echo \$yourvar 4
echo 값 입력:
read myvar
echo '$myvar'=$myvar
exit 0
- $myvar 과 "$yourvar" 는 변수의 내용이 출력된다.
- '$myvar'와 \$yourvar 는 변수명이 문자열 그대로 출력된다.
- read 실행문을 쓰면 myvar에 내가 입력한 값이 저장이 된다.
숫자 계산
- 변수에 대입된 값은 모두 문자열로 취급
- 변수에 들어있는 값을 숫자로 해서 +, -, *, / 등의 연산을 하려면 expr을 사용
- 수식에 괄호 또는 곱하기(*)는 그 앞에 꼭 역슬래쉬(\)를 붙임
#!/bin/sh
num1=100
num2=$num1+200
echo $num2
num3=`expr $num1 + 200`
echo $num3
num4=`expr \( $num1 + 200 \) / 10 \* 2`
echo $num4
exit 0
주의해야 할 것은 ' '가 아니라 ` `를 써야한다.
- num2는 expr을 사용하지 않아 문자열 취급을 해서 100+200이 출력된다.
- num3는 expr을 사용해 연산을 하여 300이 출력된다.
- num4는 expr을 사용하고 괄호를 먼저 계산하여 300 / 10 * 2 = 60 이 된다.
파라미터 변수
- 파라미터 변수는 $0, $1, $2 ... 의 형태를 가진다.
- 실행하는 명령의 부분 하나하나를 변수로 지정한다는 의미이다.
- 전체 파라미터는 $* 로 표현한다.
#!/bin/sh
echo "실행파일 이름은 <$0>이다."
echo "첫번째 파라미터는 <$1>이고, 두번째 파라미터는 <$2>이다."
echo "전체 파라미터는 <$*>이다."
exit 0
- sh paravar.sh 파라미터1 파라미터2 를 입력한다.
- $0는 파일 이름 이 된다.
- $1이 파라미터1 이 된다.
- $2가 파라미터2 가 된다.
- $* 전체 파라미터를 출력한다.
조건문
기본 if 문
기본적으로 if문의 기본 문법은 다음과 같다.
if [ 조건 ]
then
참일 경우 실행
fi
조건문에서 주의해야 할 점은 '[ 조건 ]' 사이의 각 단어에는 모두 공백이 있어야 한다.
#!/bin/sh
if [ "woo" = "woo" ]
then
echo "참입니다."
fi
exit 0
if ~ else 문
if else 문의 기본 문법은 다음과 같다.
if [ 조건 ]
then
참일 경우 실행
else
거짓일 경우 실행
fi
#!/bin/sh
if [ "woo" = "zang" ]
then
echo "참입니다."
else
echo "거짓입니다."
fi
exit 0
woo와 zang은 다르므로 else 조건의 거짓입니다. 가 출력된다.
조건문에 들어가는 비교 연산자
비교 연산자는 문자열 비교 연산자와 산술 연산자가 있다.
#!/bin/sh
if [ 100 -eq 200 ]
then
echo "100과 200은 같다."
else
echo "100과 200은 다르다."
fi
exit 0
파일과 관련된 조건
#!/bin/sh
fname=/lib/systemd/system/sshd.service
if [ -f $fname ]
then
head -5 $fname
else
echo "sshd 서버가 설치되지 않았습니다."
fi
exit 0
- fname 변수에 httpd 서버 실행 파일을 저장
- fname 변수에 저장된 파일은 일반 파일이므로 참이된다. 그러므로 fname에 들어있는 파일의 앞 5줄을 출력하게 된다.
case ~ esac
- if 문은 참과 거짓 두 경우만 사용 가능 (이중분기)
- 여러 가지 경우의 수가 있다면 case 문 (다중분기)
- 각 조건의 결과 마지막에는 ;; 이 들어가야 한다.
- case 문을 종료할 때는 case를 거꾸로 쓴 esac을 써준다.
#!/bin/sh
case "$1" in
start)
echo "시작~~";;
stop)
echo "중지~~";;
restart)
echo "다시 시작~~";;
*)
echo "뭔지 모름~~";;
esac
exit 0
$1 파라미터 변수가 무엇인지에 따라 출력값이 변하게 된다.
#!/bin/sh
echo "리눅스가 재미있나요? (yes / no)"
read answer
case $answer in
yes | y | Y | Yes | YES)
echo "다행입니다."
echo "더 열심히 하세요 ^^";;
[nN]*)
echo "안타깝네요. ㅠㅠ";;
*)
echo "yes 아니면 no 만 입력해주세요"
exit 1;;
esac
exit 0
- answer라는 변수에 입력한 값을 받는다.
- 입력된 값이 yes, y, Y, Yes, YES 중에 하나면 해당 조건문의 결과를 출력한다. 실행할 구문이 더 있으면 ;;을 붙이지 않는다.
- 앞에 n, N이 들어가는 모든 단어를 다 인정한다는 의미다. 아래 조건문을 붙인다.
- 그 외에 결과는 yes 아니면 no 만 입력해달라고 한다.
- 정상적인 종료가 아니므로 exit 1로 종료한다.
AND, OR 관계 연산자
- and는 '-a' 또는 '&&'를 사용
- or는 '-o' 또는 '||'를 사용
#!/bin/sh
echo "보고 싶은 파일명을 입력하세요"
read fname
if [ -f $fname ] && [ -s $fname ] ; then
head -5 $fname
else
echo "파일이 없거나, 크기가 0입니다."
fi
exit 0
- 입력한 파일이 일반 파일이면서 크기가 0 이 아니면 위에서 5줄 출력하고, 아니면 "파일이 없거나, 크기가 0입니다"를 출력한다.
반복문
for~in 문
- 변수에 각각의 값을 넣은 후 do 안에 있는 '반복할 문장'을 실행한다. 값의 갯수만큼 반복 실행된다.
- 형식
for 변수 in 값1 값2 값3 ...
do
반복할 문장
done
#!/bin/sh
hap=0
for i in `seq 1 10`
do
hap=`expr $hap + $i`
done
echo "1부터 10까지의 합: "$hap
exit 0
hap이라는 변수의 초기값은 0으로 두고 1~10까지 반복문으로 hap에 더한다.
최종적으로 55 라는 결과값을 출력한다.
#!/bin/sh
for fname in $( ls *.sh )
do
echo "------$fname-------"
head -3 $fname
done
exit 0
현재 디렉토리에 있는 셸 스크립트 파일(*.sh)의 파일명과 앞 3줄을 출력하는 프로그램이다.
while 문
- 조건식이 참인 동안 계속 반복
- [ 1 ] 또는 [ : ]가 오면 항상 참이 됨. 그러므로 4행을 무한 루프로 반복한다.
- Ctrl + c 를 누르면 실행이 취소된다.
#!/bin/sh
while [ : ]
do
echo "록키 리눅스 9"
done
exit 0
- 1에서 10까지의 합계를 출력
#!/bin/sh
hap=0
i=1
while [ $i -le 10 ]
do
hap=`expr $hap + $i`
i=`expr $i + 1`
done
echo "1부터 10까지의 합 : "$hap
exit 0
- 비밀번호를 입력받고, 비밀번호가 맞을 때까지 계속 입력받는 스크립트
#!/bin/sh
echo "비밀번호를 입력하세요."
read mypass
while [ $mypass != '1234' ]
do
echo "틀렸습니다. 다시 입력하세요."
read mypass
done
echo "맞았습니다."
exit 0
until 문
- while 문과 용도가 거의 같지만, until 문은 조건식이 참일 때까지(=거짓인 동안) 계속 반복한다.
- while2.sh를 동일한 용도로 until 문으로 바꾸려면 4행을 다음과 같이 바꾸면 된다
until [ $i -gt 10 ]
#!/bin/sh
hap=0
i=1
until [ $i -gt 10 ]
do
hap=`expr $hap + $i`
i=`expr $i + 1`
done
echo "1부터 10까지의 합 : "$hap
exit 0
break, continue, exit, return 문
- break는 반복문을 종료
- continue는 반복문의 조건식으로 돌아가게 함
- exit는 해당 프로그램을 완전히 종료
- return은 함수 안에서 사용될 수 있으며 함수를 호출한 곳으로 돌아가게 함
#!/bin/sh
echo "무한 반복 입력을 시작합니다. (b:break, c:continue, e:exit)"
while [ 1 ] ; do
read input
case $input in
b | B)
break;;
c | C)
echo "continue를 누르면 while의 조건으로 돌아감"
continue;;
e | E)
echo "exit를 누르면 프로그램(함수)를 완전히 종료함"
exit 1;;
esac;
done
echo "break를 누르면 while을 빠져나와 지금 이 문장이 출력됩니다."
exit 0
사용자 정의 함수
- 사용자가 직접 함수를 작성하고 호출할 수 있다.
- 형식
함수이름 () {
내용들...
}
함수이름
#!/bin/sh
myFunction() {
echo "함수 안으로 들어왔음"
return
}
echo "프로그램을 시작합니다."
myFunction
echo "프로그램을 종료합니다."
exit 0
함수의 파라미터 사용
- 함수를 호출할 때 뒤에 파라미터를 붙이면 된다.
- 함수 안에 $1, $2, ... 과 같은 형식으로 사용하면 된다.
- 형식
함수이름 () {
$1, $2, ... 등을 사용
}
함수이름 파라미터1 파라미터2 ...
#!/bin/sh
hap() {
echo `expr $1 + $2`
}
echo "더할 변수를 입력하세요."
read fn sn
echo $fn "더하기" $sn"을 실행합니다."
hap $fn $sn
exit 0
eval
- 문자열을 명령문으로 인식하고 실행
#!/bin/sh
str="ls -l eval.sh"
echo $str
eval $str
exit 0
- echo는 str 변수의 값인 ls -l eval.sh를 출력한다.
- eval은 str 변수의 값인 ls -l eval.sh를 명령으로 인식하고 실행한다.
export
- 특정 변수를 외부 변수로 선언해준다.
- 선언한 변수를 다른 프로그램에서도 사용할 수 있도록 해준다.
#!/bin/sh
echo $var1
echo $var2
exit 0
#!/bin/sh
var1="지역 변수"
export var2="외부 변수"
sh exp1.sh
exit 0
- var2는 외부 변수로 선언해주어서, 외부 프로그램(exp1.sh)에서도 사용이 가능해진다.
printf
- C언어의 printf() 함수와 비슷하게 형식을 지정해서 출력
#!/bin/sh
var1=100.5
var2="재미있는 리눅스"
printf "%5.2f \n\n \t %s \n" $var1 "$var2"
exit
- %5.2f 하면 실수형으로 5자리까지 소수점은 2자리까지 출력하라는 의미이다.
- \n은 한줄을 넘기라는 의미이며, 2개가 있으므로 2줄을 넘긴다.
- \t는 Tab키를 한 번 하라는 의미이며, 들여쓰기가 된다.
- %s는 문자열을 출력하라는 의미이다.
- $var1이 %5.2f 자리에 들어가고, $var2가 %s 자리에 들어가게 된다.
- $var2의 경우 값 중간에 공백이 들어가므로 " "로 묶어야 오류가 나지 않는다.
set과 $(명령)
- 리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용
- 결과를 파라미터로 사용하고자 할 때는 set과 함께 사용
#!/bin/sh
echo "오늘 날씨는 $(date) 입니다."
set $(date)
echo "오늘은 $4 요일 입니다."
exit 0
- $(date)를 하면 date 명령을 실행한 결과인 년. 월. 일. 요일. 시간이 나온다.
- set을 하면 $(date)의 결과를 $1, $2, $3 ... 등의 파라미터 변수에 저장한다.
- $4를 하면 4번째 변수인 현재 요일을 출력하게 된다.
shift
- 파라미터 변수를 왼쪽으로 한 단계씩 이동시킨다.
#!/bin/sh
myfunc() {
str=""
while [ "$1" != "" ] ; do
str="$str $1"
shift
done
echo $str
}
myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
exit 0
- 3행 : 결과를 누적할 변수 str를 초기화 한다.
- 4행 : $1 파라미터가 비어있지 않은 동안에 반복 실행한다. 처음 $1은 AAA고 한 번 반복 실행하면 5, 6 행에 의해 $1이 BBB가 된다.
- 5행 : str 변수에 $1을 추가한다.
- 6행 : 전체 파라미터를 왼쪽으로 쉬프트시킨다. 즉, $2 -> $1, $3 -> $2, $4 -> $3, ... 의 형태로 이동된다.
- 8행 : while 문이 끝나면 누적한 str 변수를 출력한다.
728x90
반응형