Linux/Bash shell

[Linux-vim] vim에디터 사용하기 2 - 기본 문법 / 연산 문법 ( $(( )) / let )/if 분기문

걍작 2022. 3. 12. 22:44

# 정리

# 기본 문법
 - 파라미터 $0,$1,$2는 명령의 부분들을 변수로 지정한다는 의미이다.
 - expr 은 연산자와 숫자 사이에 띄어쓰기를 꼭 넣어줘야 한다.
 - 변수=$(명령어)을 대체하여 변수=`명령어` 형태로 명령어나 출력문의 결과 값을 변수값에 저장할 수 있다.


# operator 연산문법
(기본 연산)
//$((수식)) 형태로 연산이 가능하다.
//let 수식, let '수식', let "수식" 형태로 다양하게 연산이 가능하다. 
 - $(( ))와 달리 +=/-= 등의 연산자 조합을 사용할 수 있다.
 -따옴표가 없으면 띄어쓰기를 제거해야한다.
 -$1, $2 같은 시스템에서 제공하는 파라미터를 쓰려면, " "를 써야한다. 
  (vim에디터 사용하기 3 - until 예제 참조)

(추가 팁)
< for문의 조건파트를 제외하고는 대체로 "++변수" 형태로 사용하는 것이 좋다. >
//$((su++)) - ++은 이런 형태로 사용해야한다.
 - (예문 참조) ++su는 수가 증가하는데 su++는 증가 안함
  * su++는 할당을 하고, ++를 하기 때문에 숫자가 증가하기 전에 이미 할당되면서 효과를 못보는 것이다.
    (할당을 안하고 출력문에 ++할 때는 숫자가 증가하는 것을 볼 수 있다.)


# let 명령어를 활용한 연산 연습
//$(( ))를 let' '으로 바꾸면 $(( ))와 달리 +=/-= 등의 연산자 조합을 사용할 수 있다.
//let 수식, let '수식', let "수식" 형태로 다양하게 쓸 수 있다.
 -따옴표가 없으면 띄어쓰기를 제거해야한다.
 -$1, $2 같은 시스템에서 제공하는 파라미터를 쓰려면, " "를 써야한다. 
  (vim에디터 사용하기 3 - until 예제 참조)


# if 분기문
//then - (elif) - (else) - fi 로 뼈대를 만든다.
//if((조건)) : ((조건))형태로 괄호를 2개 사용해야 하며, (( ))안이기 때문에 $표시가 없어도 변수 인식 가능하다.
//블록에 { }가 없기 때문에 블록 내부의 변수도 블록 밖에서 효력을 가진다. 
//0,1을 조건에 넣어 참, 거짓으로 표현할 수 있다.

 

 

# 기본 문법 

//echo는 "문자열"과 $(변수) 사이에 띄어쓰기를 인식하여 출력해준다.

//파라미터 $0,$1,$2는 명령의 부분들을 변수로 지정한다는 의미이다.

 - 명령어 ./sh01hello.sh 111 222 >> $0 - h01hello.sh  / $1 - 111 / $2 - 222

//expr 은 연산자와 숫자 사이에 띄어쓰기를 꼭 넣어줘야 한다.

//변수=$(명령어)을 대체하여 변수=`명령어` 형태로 명령어나 출력문의 결과 값을 변수값에 저장할 수 있다.

#!/bin/bash
clear 
pwd
echo $0

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

#-e option >> enable interpretation of backslash escape
#\n >> new line 
echo -e "Hello \nLinux"

#%s >> string will be inserted
printf "name : %s\n" "kim"


#$(( ))means calculate inside ()
echo $((11+22+33))

#Don't forget spacebar between (oprator & string) when use expr
expr 11+22+33
expr 11 + 22 + 33

#variable
kor=99
echo $kor

var_pwd=$(pwd)
echo $var_pwd


#command following sentence >> ./sh01hello.sh 111 222
echo $1 + $2 = $(($1+$2))

result=$(expr 11 + 22 + 33)
echo result: $result
echo result:$result

#``<< it would be confuse. better to use $()
result=`expr 11 + 22 + 33`
echo result:$result


exit 0

 


 

# operator 연산 문법 1 

// xor - 두 개중 한 개만 참일 때 true반환

// A<<B - A의 이진수를 B만큼 왼쪽으로 이동(shift)

 - 이진법이므로 단위 수가 올라갈 수록(좌측으로 갈 수록) 값이 2배가 된다. >> 좌측 이동은 2배, 우측 이동은 1/2배

#!/bin/bash
clear 
pwd
echo $0

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

#+ - * / % **
echo $((10 + 3))
echo $((10 - 3))
echo $((10 * 3))
echo $((10 / 3))
echo $((10 % 3))
echo $((10 ** 3))

#logic  & | ^
#10 - 1010 / 3 - 0011  
echo $((10 & 3))
echo $((10 | 3))
echo $((10 ^ 3))

#shift >> <<
echo $((10 >> 3))
echo $((10 << 3))

#bool > < >= <= != ==
echo $((10 > 3))
echo $((10 < 3))
echo $((10 >= 3))
echo $((10 <= 3))
echo $((10 != 3))
echo $((10 == 3))


exit 0

 

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

# operator 연산 문법 2 

< for문의 조건파트를 제외하고는 대체로 "++변수" 형태로 사용하는 것이 좋다. >

//$((su++)) - ++은 이런 형태로 사용해야한다.

 - (예문 참조) ++su는 수가 증가하는데 su++는 증가 안함

  * su++는 할당을 하고, ++를 하기 때문에 숫자가 증가하기 전에 이미 할당되면서 효과를 못보는 것이다.

    (할당을 안하고 출력문에 ++할 때는 숫자가 증가하는 것을 볼 수 있다.)

echo "----------------------------"
su=10
su=$((++su))
echo $su
su=$((++su))
echo $su
su=$((++su))
echo $su
su=$((su++))
echo $su
su=$((su++))
echo $su
su=$((su++))
echo $su
echo $((su++))
echo $((su++))
echo $((su++))

 

 


# let 명령어를 활용한 연산 연습

//$(( ))를 let' '으로 바꾸면 $(( ))와 달리 +=/-= 등의 연산자 조합을 사용할 수 있다.

//let 수식, let '수식', let "수식" 형태로 다양하게 쓸 수 있다.

 -따옴표가 없으면 띄어쓰기를 제거해야한다.

 -$1, $2 같은 시스템에서 제공하는 파라미터를 쓰려면, " "를 써야한다. 

  (vim에디터 사용하기 3 - until 예제 참조)

#!/bin/bash
clear 
pwd
echo $0
echo "----------------------------"

kor=10
#$kor is recognizing as string value without $(( ))
plus1=$kor+10
plus2+=$kor+20
plus3=$((kor+30))
plus4=$((plus_40+40))
echo $plus1
echo $plus2
echo $plus3
echo $plus4


let 'su1 = 20'
let su2=su1+100
echo $su1 $su2

let 'su2 += 10000'
echo $su1 $su2

let 'su2 -= 10000'
echo $su1 $su2

let "su2 *= 10000"
echo $su1 $su2

let "su2 /= 10000"
echo $su1 $su2

exit 0

 


 

# if 분기문 

//then - (elif) - (else) - fi 로 뼈대를 만든다.

//if((조건)) : ((조건))형태로 괄호를 2개 사용해야 하며, (( ))안이기 때문에 $표시가 없어도 변수 인식 가능하다.

//블록에 { }가 없기 때문에 블록 내부의 변수도 블록 밖에서 효력을 가진다. 

//0,1을 조건에 넣어 참, 거짓으로 표현할 수 있다.

 - ex. if((1));then

 

//성적처리 예제 mission

#!/bin/bash
clear 
pwd
echo $0

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

#0-false / 1-true
if((0));then
	echo aaa
fi

if((1));then
	echo bbb
fi

echo "----------------------------"
su1=10
su2=100

#not nessasery to use '$' in (())
if((su1>=su2));
then
	echo ccc
else
	echo ddd
fi

echo "----------------------------"
su3=10

#if - if
if((su3>=10));
then
	echo odd
	if((su3%2==0));
	then
		echo even
	fi	
fi

echo "----------------------------"
#grade process mission
avg=82
if((avg>=90));then
	echo A
elif((avg>=80));then	
	echo B
elif((avg>=70));then
	echo C
elif((avg>=60));then
	echo D
else
	echo F
fi


exit 0