[Linux-vim] vim에디터 사용하기 3 - 문법 read / case in, for in / for / while, until
#정리
# 읽기 명령 - 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