shell

2024. 1. 28. 18:41Linux

#!/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가 된다.

 

0128_sh.tar
0.04MB

 

'Linux' 카테고리의 다른 글

XRDP  (0) 2024.01.31
SSH  (0) 2024.01.30
텔넷  (0) 2024.01.29