shell
2024. 1. 28. 18:41ㆍLinux
#!/bin/sh
if [ "woo" = "woo" ]
then
echo "true"
fi
exit 0
#!/bin/sh
if [ "woo" != "woo" ]
then
echo "true"
else
echo "false"
fi
exit 0
#!/bin/sh
echo "사용자 이름 : "$USER
echo "홈 디렉터리 : "$HOME
exit 0
#!/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
#변수에 넣은 값은 모두 문자열로 취급
#만약 +,-,*,/ 등의 연산을 하려면 expr 키워드를 사용하면 됨 (숫자1 왼쪽의 역따옴표(`)로 묶어줘야함)
#수식에 괄호를 사용하려면 그 앞에 꼭 역슬래시(\)를 붙여줘야 함. 또 +,-,/와 달리 곱하기(*)도 예외적으로
#앞에 역슬래시 (\)를 붙여줘야 함
#!/bin/sh
echo "실행파일 이름은 <$0>이다"
echo "첫번째 파라미터는 <$1>이고, 두번째 파라미터는 <$2>다"
echo "전체 파라미터는 <$*>다"
exit 0
#!/bin/sh
myvar="Hi Woo"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar
echo 값 입력 :
read myvar
echo '$myvar' = $myvar
exit 0
조건문에 들어가는 비교 연산자
문자열 비교 | 결과 |
"문자열1"="문자열2" | 두 문자열이 같으면 참 |
"문자열1" != "문자열2" | 두 문자열이 같지 않으면 참 |
-n "문자열" | 문자열이 NULL(빈 문자열)이 아니면 참 |
-z "문자열" | 문자열이 NULL(빈 문자열)이면 참 |
산술 비교 연산자
산술비교 | 결과 |
수식1 -eq 수식2 | 두 수식(또는 변수)이 같으면 참 |
수식1 -ne 수식2 | 두 수식(또는 변수)이 같지 않으면 참 |
수식1 -gt 수식2 | 수식1이 크다면 참 |
수식1 -ge 수식2 | 수식1이 크거나 같으면 참 |
수식1 -lt 수식2 | 수식1이 작으면 참 |
수식1 -le 수식2 | 수식1이 작거나 같으면 참 |
!수식 | 수식이 거짓이면 참 |
if else
#!/bin/sh
if [ 100 -eq 200 ]
then
echo "100 equal 200"
else
echo "100 nEqual 200"
fi
exit 0
파일 조건 | 결과 |
-d 파일이름 | 파일이 디렉터리면 참 |
-e 파일이름 | 파일이 존재하면 참 |
-f 파일이름 | 파일이 일반 파일이면 참 |
-g 파일이름 | 파일에 set-group-id가 설정되면 참 |
-r 파일이름 | 파일이 읽기 가능이면 참 |
-s 파일이름 | 파일 크기가 0이 아니면 참 |
-u 파일이름 | 파일에 set-user-id가 설정되면 참 |
-w 파일이름 | 파일이 쓰기 가능 상태면 참 |
-x 파일이름 | 파일이 실행 가능 상태면 참 |
if/else
#!/bin/sh
fname=/lib/systemd/system/sshd.service
if [ -f $fname ]
then
head -5 $fname
else
echo "sshd 서버가 설치되지 않았습니다."
fi
exit 0
#[Unit]
#Description=OpenSSH server daemon
#Documentation=man:sshd(8) man:sshd_config(5)
#After=network.target sshd-keygen.target
#Wants=sshd-keygen.target
case1
#!/bin/sh
case "$1" in
start)
echo "start";;
stop)
echo "stop";;
restart)
echo "restart";;
*)#그외 (default)
echo "모름";;
esac
exit 0
#[root@localhost wingold]# sh case1.sh test
#모름
#[root@localhost wingold]# sh case1.sh start
#start
case2
#!/bin/sh
echo "리눅스가 재밌나요? (yes / no)"
read answer
case $answer in
yes|y|Y|Yes|YES)
echo "good"
echo "cheering for you";;
[nN]*)#앞에 n또는 N이 들어가는 모든 단어를 인정한다는 의미
echo "ok"
echo "Still try hard";;
*)
echo "yes or no"
exit 1;;#정상적인 종료가 아니므로 1로 종료(필수X)
esac
exit 0
AND,OR
#!/bin/sh
echo "보고 싶은 파일명을 입력하세요"
read fname
if [ -f $fname ] && [ -s $fname ] ; then
head -5 $fname
else
echo "파일이 없거나, 크기가 0입니다."
fi
exit 0
#and는 -a 또는 && or은 -o 또는 ||를 사용
#-a 나 -o는 테스트문([])안에서 사용할 수 있는데 이때 괄호 등 특수문자 앞에는 (\)를 붙여줘야 함
for~in
#!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
do
hap=`expr $hap + $i`
done
echo "1부터 10까지의 합 :"$hap
exit 0
#이렇게도 가능
#!/bin/sh
hap=0
for((i=1;i<=10;++i))
do
hap=`expr $hap + $i`
done
echo "1부터 10까지의 합 : "$hap
exit 0
#이렇게도 가능2
#!/bin/sh
hap=0
for i in `seq 1 10`
do
hap=`expr $hap + $i`
done
echo "1부터 10까지의 합:"$hap
exit 0
#1부터 10까지의 합 :55
for~in 2
#!/bin/sh
for fname in $(ls *.sh)
do
echo "--------$fname--------"
head -3 $fname
done
exit 0
#--------andor.sh--------
#!/bin/sh
echo "보고 싶은 파일명을 입력하세요"
read fname
--------case1.sh--------
#!/bin/sh
case "$1" in
start)
--------case2.sh--------
#!/bin/sh
echo "리눅스가 재밌나요? (yes / no)"
read answer
--------forin1-1.sh--------
#!/bin/sh
hap=0
for((i=1;i<=10;++i))
--------forin1-2.sh--------
#!/bin/sh
hap=0
for i in `seq 1 10`
--------forin1.sh--------
#!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
--------forin2.sh--------
#!/bin/sh
for fname in $(ls *.sh)
do
--------if1.sh--------
#!/bin/sh
if [ "woo" = "woo" ]
then
--------if2.sh--------
#!/bin/sh
if [ "woo" != "woo" ]
then
--------if3.sh--------
#!/bin/sh
if [ 100 -eq 200 ]
then
--------if4.sh--------
#!/bin/sh
fname=/lib/systemd/system/sshd.service
if [ -f $fname ]
--------name.sh--------
#!/bin/sh
echo "사용자 이름 : "$USER
echo "홈 디렉터리 : "$HOME
--------numcalc.sh--------
#!/bin/sh
num1=100
num2=$num1+200
--------parvar.sh--------
#!/bin/sh
echo "실행파일 이름은 <$0>이다"
echo "첫번째 파라미터는 <$1>이고, 두번째 파라미터는 <$2>다"
--------var1.sh--------
#!/bin/sh
myvar="Hi Woo"
echo $myvar
while
#!/bin/sh
while [ 1 ]
do
echo "test"
done
exit 0
#test
#test
#test
# . . . (무한반복)
#조건식 위치에 [ 1 ] 또는 [ : ]이 오면 항상 참. 취소는 ctrl + c
#!/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 "password : "
read mypass
while [ $mypass != "1234" ]
do
echo "Invalid password. Please try again."
echo "password : "
read mypass
done
echo "done."
exit 0
until
#!/bin/sh
echo "password :"
read mypass
until [ $mypass = "1234" ]
do
echo "Invalid password. Please try again."
echo "password :"
read mypass
done
echo "done."
exit 0
#until은 조건식이 참일 때까지 반복한다.
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
함수사용 (파라미터)
#파라미터 사용 예시
#!/bin/sh
hap () {
echo `expr $1 + $2`
return
}
echo "10 더하기 20을 실행합니다"
hap 10 20
exit 0
#함수의 파라미터(인자)를 사용하려면 함수를 호출할 때 뒤에 파라미터를 붙여서 호출
#함수 안에서는 $1,$2,... 로 사용
eval (문자열을 명령문으로 인식하고 실행)
#!/bin/sh
str="ls -l eval.sh"
echo $str
eval $str
exit 0
#ls -l eval.sh
#-rw-r--r--. 1 root root 57 1월 28 21:46 eval.sh
#!/bin/sh
echo "명령 입력"
read cmd
eval $cmd
exit 0
export
외부 변수로 선언 선언한 변수를 다른 프로그램에서도 사용할 수 있음
#exp1.sh
#!/bin/sh
echo $var1
echo $var2
exit 0
#exp2.sh
#!/bin/sh
var1="지역 변수"
export var2="외부 변수"
sh exp1.sh
exit 0
#[root@localhost wingold]# sh exp2.sh
#
#외부 변수
#[root@localhost wingold]#
printf
C 언어의 printf() 함수와 비슷하게 형식을 지정해서 출력
#!/bin/sh
var1=100.5
var2="Test"
printf "%5.2f \n\n \t %s \n" $var1 "$var2"
exit
#[root@localhost wingold]# sh printf.sh
#100.50
#
# Test
#%5.2f는 총 5자리며 소수점 아래 2자리까지 출력
#\n은 1줄을 넘기는 개행 문자
#\t는 Tab문자
#%s는 문자열 출력
#주의점은 공백이 있는 문자의 경우 ""로 묶어줘야 오류가 발생하지 않는다.
set과 $(명령)
#!/bin/sh
echo "오늘 날짜는 $(date) 입니다."
set $(date)
echo "오늘은 $4 요일 입니다."
exit 0
#[root@localhost wingold]# sh set.sh
#오늘 날짜는 2024. 01. 28. (일) 22:04:23 KST 입니다.
#오늘은 (일) 요일 입니다.
#$(date)는 date 명령을 실행한 결과를 보여줌
#set명령을 사용하면 파라미터 변수에 저장됨
#ex)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
#[root@localhost wingold]# sh shift.sh
#AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
#전체 파라미터를 왼쪽으로 시프트시킨다. 즉 $2 -> $1, $3 -> $2 . . .의 형태로 작업이 일어난다.
#즉 "$1"은 처음에 AAA이고 그 후 shift를 하니 $1은 BBB가 된다.