Linux/Bash shell

[Linux-vim] vim에디터 사용하기 3 - 문법 read / case in, for in / for / while, until

걍작 2022. 3. 13. 20:15

#정리

# 읽기 명령 - read 
// -p 옵션으로 입력할 값에 대한 설명을 줄 수 있다. 
// 설치파일에서 yes/no 선택문 같은 입력창이 이런 느낌으로 나왔던 것이다.
- read / select 명령어 활용

# case in 분기문
//case in - esac 으로 뼈대를 만든다.
// ")"표시로 케이스 구분하며, ;; 2개 넣어줘야함
 -조건 여러개 가능
 -문자열(대소문자 구분)로 조건 가능
 -[ ]를 통해 2개 이상의 조건 가능

# for 반복문
(Basic)
//for - do - done 으로 뼈대를 만든다.
//for와 (( )) 사이는 꼭 띄어쓸 필요는 없지만, if 와 (( )) 사이 띄어쓰기 해주는 것처럼 맞춰주면 덜 헷갈린다.
//do를 아래로 내리면 (( ))다음 ;을 쓰지 않아도 된다.
//for문 안에서는 ++와 같은 연산자가 인식된다.
 - $(( ))연산에서는 ++ 같은 연산자가 안 먹혀서 숫자가 증가하지 않는다.

(for in)
//for in - do - done 뼈대로 만든다(case in 구조와 유사).
//값의 갯수가 가변적이어도 대응할 수 있어, 파일 목록 등을 출력할 때 유용하다.

(seq 활용)
//(seq 시작번호 종료번호) 형태로 시퀀스 출력 가능하며, seq 명령어를 변수로 넣을 수 있다.
// $( ) 를 ` `로 대체할 수 있다.

(for in for)
//구구단으로 연습해보자
- printf 표현식 2가지로 가능 printf "%d*%d=%d" $x $i $((x*i)) >>  printf $x*$i=$((x*i))
//seq도 동일하게 중복 적용 가능하다.

# while 반복문 
//while - do - (break) - done 뼈대로 만든다.
//무한 루프(true 반환) 돌리는 방법 4가지 
 - while ((5==5))
 - while [ 5 == 5 ]  -  띄어쓰기 필수, 문법이 헷갈릴 수 있어서 주의
   >> 문자열 비교에서 필요함 ( ex. while [ $key = "y" ] )
 - while true 
 - while : 

# until 반복문 
//until [ ] - do - done 뼈대로 만든다.
//while과 반대로 명제가 거짓일 때 루프 실행 
 - (좌측 이미지) 조건이 false일 때, while은 실행 안됨 / until은 무한 루프
 - (우측 이미지) key가 맞아야(true여야) 루프가 멈춘다.

 

//서버를 배포시킨다.

 - 개발 종료 후, 이클립스 없이 서버를 키지 않고 서버를 실행시킬 수 있게하는 것.

 - WAR file로 자동 배포를 할 수 있다.

 

//shell script는 블록이 없고, 변수에 타입이 없다.

 - 블록 밖에서도 변수를 사용할 수 있다.

 - 타입 추론의 초기 버젼으로 약간의 융통성이 있다.

 

 

# 읽기 명령 - read 

// -p 옵션으로 입력할 값에 대한 설명을 줄 수 있다. 

// 설치파일에서 yes/no 선택문 같은 입력창이 이런 느낌으로 나왔던 것이다.

- read / select 명령어 활용

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"
#practice mission
#kor, eng, math << read
#total, avg << printf
#grade << if/printf

#read scores using read command
read -p "kor score: " kor
read -p "eng score: " eng
read -p "math score: " math

echo kor:$kor eng:$eng math:$math

#define 'total' using let command && define 'avg' using $(( ))
let 'total=kor+eng+math'
avg=$((total/3))
echo total: $total avg : [$avg]
printf "total:%d avg:[%.2f]\n" $total $avg


grade="A"
if ((avg>=90));then
	grade="A"
elif((avg>=80));then	
	grade="B"
elif((avg>=70));then
	grade="C"
elif((avg>=60));then
	grade="D"
else
	grade="F"
fi

echo grade: $grade


exit 0

 


------------------------------------------------------------------------------------------

# case in 분기문

//case in - esac(이삭) 으로 뼈대를 만든다.

// ")"표시로 케이스 구분하며, ;; 2개 넣어줘야함

 -조건 여러개 가능

 -문자열(대소문자 구분)로 조건 가능

 -[ ]를 통해 2개 이상의 조건 가능

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

result="kim"

case $result in 
	1) echo "aaa";;
	2) echo "bbb";;
	3) echo "ccc";;
	x) echo "ddd";;
	[yY]) echo "ggg";;
	kim) echo "fff";;
esac

printf "Choose text\n a)aaa\n b)bbb\n c)ccc\n d)ddd\n"


#pirnt result according to input value
read -p "Input [a-d]:" select

case $select in
	a) echo "aaa";;
	b) echo "bbb";;
	c) echo "ccc";;
	d) echo "ddd";;
esac


exit 0

 

 


<for  - 1. 전통방식 / 2. for in / 시퀀스 명령(seq) 활용>

 

# for 반복문 -  1. Basic 

//for - do - done 으로 뼈대를 만든다.

//for와 (( )) 사이는 꼭 띄어쓸 필요는 없지만, if 와 (( )) 사이 띄어쓰기 해주는 것처럼 맞춰주면 덜 헷갈린다.

//do를 아래로 내리면 (( ))다음 ;을 쓰지 않아도 된다.

//for문 안에서는 ++와 같은 연산자가 인식된다.

- $(( ))연산에서는 ++ 같은 연산자가 안 먹혀서 숫자가 증가하지 않는다 (아래 실행문 참조).

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

su=10
echo $su

#cannot interpret ++ inside $(())
su=$((su++))
echo $su

for((i=0;i<10;i++));do
	echo $i
done


for ((i=0;i<10;i++));
do
	printf $i
done
#'echo' to change line 
echo


#print even values only
for ((i=0;i<10;i++));
do
	if ((i%2==0));
	then
		printf $i
	fi
done
echo


exit 0

 

 

----------------------------------------------

# for 반복문 - 2. for in 

//for in - do - done 뼈대로 만든다(case in 구조와 유사).

//값의 갯수가 가변적이어도 대응할 수 있어, 파일 목록 등을 출력할 때 유용하다.

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

for i in 11 22 33
do 
	echo $i
done

for i in aaa bbb ccc ddd
do
	echo $i
done

echo "------------ls--------------"
ls
echo "---------for ls-------------"
for i in $(ls)
do
	echo $i
done
echo "----------------------------"


exit 0

 

 

----------------------------------------------

#for 반복문 - 3. seq 활용

// (seq 시작번호 종료번호) 형태로 시퀀스 출력 가능하며, seq 명령어를 변수로 넣을 수 있다.

 

// $( ) 를 ` `로 대체할 수 있다.

 

 

 

----------------------------------------------

# for 반복문 - 4. for - for (for in for) 

//구구단으로 연습해보자

- printf 표현식 2가지로 가능 printf "%d*%d=%d" $x $i $((x*i)) >>  printf $x*$i=$((x*i))

//seq도 동일하게 중복 적용 가능하다.

#!/bin/bash
clear 
pwd
echo $0

echo "------------for in for ----------------"
#9*9 dan for in for

for((x=2;x<10;x++));
do
	for((i=1;i<10;i++));
	do
		#printf "%d*%d=%d " $x $i $((x*i))
		printf $x*$i=$((x*i))" "
	done
	echo
done

echo "-------------for in for seq------------"
#9*9 dan for in for (seq command)

for x in $(seq 2 9);
do
	for i in $(seq 1 9)
	do
		printf "%d*%d=%d " $x $i $((x*i))
	done
	echo
done


exit 0

 

 


 

# while 반복문 

//while - do - done 뼈대로 만든다.

//무한루프 돌 때는 강제 종료 단축키(Ctrl + z)를 사용한다.

 

//무한 루프(true 반환) 돌리는 방법 4가지 

 - while ((5==5))

 - while [ 5 == 5 ]  -  띄어쓰기 필수, 문법이 헷갈릴 수 있어서 주의

   >> 문자열 비교에서 필요함 ( ex. while [ $key = "y" ] )

 - while true 

 - while : 

 

// while - break로 루프 종료시키기

 - break에 if 조건을 붙여 루프 멈추게 하기

 - break에 case조건을 붙여 'x'누르면 루프 멈추게 하기

#!/bin/bash
clear 
pwd
echo $0

echo "------------if - break ----------------"
#while ((5==5))
#while [ 5 == 5 ]
#while true

count=0
while :
do
	echo while...
	count=$((count+1))
	echo $count

	if ((count==5));then
		break
	fi
done

echo "------------case - break -------------"
while :
do
	echo while...
	read -p "input: " inputValue
	case $inputValue in
		a) echo aa;;
		[xX]) break;;
	esac
done


exit 0

 

 

 

// 학생 수가 정해져있지 않은 성적 처리 프로그램 만들기 Mission

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"
#score + while + break
while :
do
	read -p "input kor: " kor
	read -p "input eng: " eng
	read -p "input math: " math

	let 'total=kor+eng+math'
	avg=$((total/3))

	if ((avg>=90));then
		grade="A"
	elif ((avg>=80));then
		grade="B"
	elif ((avg>=70));then
		grade="C"
	elif ((avg>=60));then
		grade="D"
	else
		grade="F"
	fi


	echo kor: $kor eng: $eng math: $math 
	printf "total[%d], avg[%.2f], grade[%s]\n" $total $avg $grade


	read -p "Do you want to END [x]:" key
	case $key in
		[xX])break;;
	esac
done


exit 0

 


# until 반복문 

//until [ ] - do - done 뼈대로 만든다.

//while과 반대로 명제가 거짓일 때 루프 실행 

 - (좌측 이미지) 조건이 false일 때, while은 실행 안됨 / until은 무한 루프

 - (우측 이미지) key가 맞아야(true여야) 루프가 멈춘다.

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

key="x"

#while [ $key == "y" ]
until [ $key == "y" ]
do
	echo until..
	read -p "End input y:" key

done


exit 0

 

 

 

#mission : 값 3개 던져 주면 if와 until로 합산 값 도출해보기 

 <명령문 : pi@raspberry:~/practice $ ./sh09until2.sh 11 22 33 44 55>

 - $0,$1,$2,$3 : 명령어의 덩어리 순서대로 변수에 지정 ($0-파일명, $1-11, $2-22, ... , $5-55) 

 - $# : 명령 문에서 온 데이터의 갯수 

 - $@ : 실행할 때 온 인수(argument)를 배열로 받겠다.

 - shift : 첫번째 방에 값을 지우고, 각 방의 데이터를 바로 앞 방으로 이동

  ($1-11, $2-22, $3-33, $4-44, $5-55  >> $1 - '11'삭제 >>  $1-22, $2-33, $2-44, $2-55, $5-없음 )

 - $i가 변수로 인식되지 않아 기본적인 for문으로 결과 도출 불가

#!/bin/bash
clear 
pwd
echo $0

echo "------------for-array----------------"
#print total value using input vlaues 
echo $1 $2 $3
echo length: $#
echo array: $@

for i in $@
do
	echo $i
	total1=$((total1+$i))
done

echo total: $total1

echo "-------------until---------------"

echo $1 $2 $3
echo length: $#
echo array: $@

#shift로 마지막 $5의 값이 $1에 오면 다음은, $1=null이 되어 반복 종료.  
until [ $# = 0 ]
do
	echo until..
    #Because of shift command, next value is pulled in $1 value.
	let "total2 += $1"
    #value location shift
	shift
done

echo total: $total2


exit 0