κ΅¬ν˜„

κ°œμš”

Bash둜 μž‘μ„±λœ κ°„λ‹¨ν•œ 계산기 μŠ€ν¬λ¦½νŠΈμž…λ‹ˆλ‹€. μ‚¬μš©μžλ‘œλΆ€ν„° 두 개의 μˆ«μžμ™€ μ—°μ‚°μžλ₯Ό 읽고 계산을 μˆ˜ν–‰ν•œ λ‹€μŒ μ‚¬μš©μžκ°€ 쀑지λ₯Ό 선택할 λ•ŒκΉŒμ§€ 이전 κ³„μ‚°μ˜ 결과둜 계산을 계속할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš© μ–Έμ–΄

bash, shell script

μ½”λ“œ 및 ν•¨μˆ˜

μŠ€ν¬λ¦½νŠΈλŠ” λ‚˜μ€‘μ— μ‚¬μš©μž μž…λ ₯의 μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 두 개의 μ •κ·œμ‹ REGEX_NUMBER 및 REGEX_OPERATION을 μ •μ˜ν•˜λŠ” κ²ƒμœΌλ‘œ μ‹œμž‘ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ μŠ€ν¬λ¦½νŠΈλŠ” μ—¬λŸ¬ κΈ°λŠ₯을 μ •μ˜ν•©λ‹ˆλ‹€.

  • #!/bin/bash : ν•΄λ‹Ή νŒŒμΌμ„ bash μ‰˜λ‘œ μ‹€ν–‰μ‹œν‚¨λ‹€λŠ” 의미
  • TOTAL : μ—°μ‚° κ²°κ³Όλ₯Ό μ €μž₯ν•˜λŠ” μ „μ—­ λ³€μˆ˜
  • FLAG : 연산을 계속 ν•  지 μ—¬λΆ€λ₯Ό μ €μž₯ν•˜λŠ” μ „μ—­ λ³€μˆ˜
  • REGEX_NUMBER : 숫자 확인 μ •κ·œν‘œν˜„μ‹
  • REGEX_OPERATION : 사칙연산 확인 μ •κ·œν‘œν˜„μ‹

is_number

μ‚¬μš©μžμ—κ²Œ 숫자λ₯Ό μž…λ ₯ν•˜λΌλŠ” λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•œ λ‹€μŒ REGEX_NUMBER μ •κ·œμ‹μ„ μ‚¬μš©ν•˜μ—¬ μž…λ ₯이 μœ νš¨ν•œ μˆ«μžμΈμ§€ ν™•μΈν•©λ‹ˆλ‹€. μž…λ ₯이 μœ νš¨ν•œ 숫자이면 ν•¨μˆ˜λŠ” 숫자λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μž…λ ₯이 μœ νš¨ν•œ μˆ«μžκ°€ μ•„λ‹Œ 경우 ν•¨μˆ˜λŠ” μ‚¬μš©μžμ—κ²Œ λ‹€μ‹œ μ‹œλ„ν•˜λΌλŠ” λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

 

문자 μ„€λͺ…
" " " " 사이에 λ“€μ–΄μžˆλŠ” λͺ¨λ“  특수 문자λ₯Ό 일반 문자둜 μΈμ‹ν•˜μ§€λ§Œ 단, $()와 ` `(λͺ…λ Ήμ–΄ λŒ€μ²΄ 특수문자), $ (λ³€μˆ˜ κ°’ λŒ€μ²΄ 특수문자), \ (quotation 특수문자) 등은 μ˜ˆμ™Έ

즉, echo "$op" 으둜 ν•˜λ©΄ * 둜 μž…λ ₯받은 μΈμžκ°’μ„ asterisk이 μ•„λ‹Œ 문자 κ·ΈλŒ€λ‘œ * 둜 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

is_operation

is_number와 같은 λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜μ§€λ§Œ μ‚¬μš©μžμ—κ²Œ μ—°μ‚°(+, -, *, /, %)을 μž…λ ₯ν•˜λΌλŠ” λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•˜κ³  REGEX_OPERATION μ •κ·œμ‹μ„ μ‚¬μš©ν•˜μ—¬ μž…λ ₯을 ν™•μΈν•©λ‹ˆλ‹€.

is_divided_by_zero

연산이 λ‚˜λˆ„κΈ°(/)이고 두 번째 ν”Όμ—°μ‚°μžκ°€ 0인지 ν™•μΈν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 두 쑰건이 λͺ¨λ‘ 참이면 μ‚¬μš©μžμ—κ²Œ μƒˆ μ—°μ‚°κΈ°ν˜Έμ™€ 두 번째 ν”Όμ—°μ‚°μžλ₯Ό μž…λ ₯ν•˜λΌλŠ” λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

calculate

μ„Έ 개의 인수(μ—°μ‚°μžμ™€ 두 개의 ν”Όμ—°μ‚°μž)λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. case 문을 μ‚¬μš©ν•˜μ—¬ μ—°μ‚°μžλ₯Ό 기반으둜 μˆ˜ν–‰ν•  μž‘μ—…μ„ κ²°μ •ν•œ λ‹€μŒ ν”Όμ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 계산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. 계산 κ²°κ³ΌλŠ” TOTAL λ³€μˆ˜μ— μ €μž₯λ©λ‹ˆλ‹€.

is_answer

μ‚¬μš©μžμ—κ²Œ "YES" λ˜λŠ” "NO"λ₯Ό μž…λ ₯ν•˜λΌλŠ” λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•˜κ³  그에 따라 FLAG λ³€μˆ˜λ₯Ό 1 λ˜λŠ” 0으둜 μ„€μ •ν•©λ‹ˆλ‹€. 이 κΈ°λŠ₯은 μœ μ—°ν•˜λ©° μ‚¬μš©μžκ°€ λŒ€λ¬Έμž λ˜λŠ” μ†Œλ¬Έμž λ˜λŠ” μΆ•μ•½ν˜• "y" λ˜λŠ” "n"으둜 "YES" λ˜λŠ” "NO"λ₯Ό μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

main

μ‚¬μš©μžκ°€ 쀑지λ₯Ό 선택할 λ•ŒκΉŒμ§€ κ³„μ†λ˜λŠ” 루프에 λ“€μ–΄κ°‘λ‹ˆλ‹€. 루프 λ‚΄μ—μ„œ μŠ€ν¬λ¦½νŠΈλŠ” is_number 및 is_operation ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 첫 번째 숫자, μ—°μ‚°μž 및 두 번째 숫자λ₯Ό 읽은 λ‹€μŒ is_divided_by_zero ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 연산이 0으둜 λ‚˜λ‰˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 연산이 0으둜 λ‚˜λˆ„μ§€ μ•ŠλŠ” 경우 μŠ€ν¬λ¦½νŠΈλŠ” 연산을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ—°μ‚° ν•¨μˆ˜μ— μ—°μ‚°μžμ™€ ν”Όμ—°μ‚°μžλ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ μŠ€ν¬λ¦½νŠΈλŠ” μ‚¬μš©μžμ—κ²Œ κ³„μ†ν•˜κ±°λ‚˜ μ€‘μ§€ν•˜λΌλŠ” λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•˜κ³  μ‚¬μš©μžκ°€ 쀑지λ₯Ό μ„ νƒν•˜λ©΄ 루프λ₯Ό μ’…λ£Œν•©λ‹ˆλ‹€. 루프가 λλ‚˜λ©΄ μŠ€ν¬λ¦½νŠΈλŠ” TOTAL λ³€μˆ˜μ— μ €μž₯된 μ΅œμ’… κ²°κ³Όλ₯Ό μΈμ‡„ν•©λ‹ˆλ‹€.

  • $op λ₯Ό "$op"둜 λ„˜κ²¨μ€˜μ•Ό μ—°μ‚°κΈ°ν˜Έλ₯Ό λ¬Έμžμ—΄λ‘œ μΈμ‹ν•΄μ„œ μ œλŒ€λ‘œ μž‘λ™

κ²°κ³Ό

μ‹€ν–‰ 방법

sh cal.sh

ν™”λ©΄

κΆκΈˆν•œ 점

  • -eq vs =
    값을 비ꡐ할 λ•Œ, -eq와 =의 μ„±λŠ₯μ΄λ‚˜.. 차이가 μžˆλŠ”μ§€? μ–΄λ–€κ±Έ μ“°λŠ”κ²Œ 쒋은지?

+ Recent posts