[code:2yiuy6iq]
#!/bin/sh
:<<EOF
설명:
콘솔에서 사용하는 간단한 계산기입니다.
bc를 사용하여 계산하고, 그결과를 보여줍니다.
기본적으로 소숫점19자리까지 계산합니다.
기능:
기수를 사용하여 해당 진법으로 계산가능합니다.
소숫점아래 마지막 자리로 자동 반올림합니다.
사용법
minicalc [옵션] 계산식
옵션
–ibase 기수 입력값을 해당 기수로 인식
–obase 기수 해당기수로 출력
–base 기수 간단히 입출력을 모두 해당기수로 처리
–scale 실수정밀도 해당 자릿수로 반올림하여 보여줌
EOF
#----------------------------------------------------------------------
SCALE=19
BASE=
IBASE=
OBASE=
전달된 인수 파싱
옵션과 파라미터 분석
-l은 긴 옵션으로 ','로 구분되며 ':'을 붙으면 값을 가짐을 의미하며,
명령실행시 --longopt=value 혹은 --longopt value형식으로 옵션값을 적게 됩니다.
옵션과 파라미터 사이에는 '–'로 구분됨
옵션의 값은 작은따옴표로 둘러 싸이기 떄문에 eval를 사용하여 이를 없앰
eval set – getopt -o "" -l "base:,ibase:,obase:,scale:" "$@"
while true; do
case "$1" in
–base) shift; BASE=$1;;
–ibase) shift; IBASE=$1;;
–obase) shift; OBASE=$1;;
–scale) shift; SCALE=$1;;
–) shift;break
esac
shift
done
BASE 변수값이 없으면 10으로 설정
base=${BASE:-10}
IBASE,OBASE 변수값이 없으면 base값으로 설정
ibase=";ibase=${IBASE:-$base}"
radix="${OBASE:-$base}"
obase=";obase=$radix"
최대 정밀도 19로 설정
[ $SCALE -gt 19 ] && SCALE=19
#(
정밀도를 하나 더하여 설정(반올림을 위해서)하고, 입출력에 사용되는 기수를 설정(주의:ibase가 설정되면 obase값도 ibase의 기수로 입력해야 하므로, obase를 먼저 설정해야함)
echo "scale=$(($SCALE+1))$obase$ibase"
계산식이 파라미터로 전달되지 않았으면, 표준입력을 재지향하고, 아니면 그대로 출력
[ -z "$" ] && cat || echo "$"
#)
계산 명령을 실행
#|bc
10진법일경우 정밀도에 따라 반올림하여 보여주고, 그외는 그대로 출력
#|( [ $radix -eq 10 ] && xargs printf "%.${SCALE}g\n" || cat)
(
echo "scale=$(($SCALE+1))$obase$ibase";
[ -z "$" ] && cat || echo "$"
)
|bc
|( [ $radix -eq 10 ] && xargs printf "%.${SCALE}g\n" || cat)
[/code:2yiuy6iq]
minicalc 2 * 3 이런 형식으로 하면 "*"가 모든 파일명으로 인식됩니다.
이는 bash의 glob(와일드카드와 비슷함)기능으로 명령이 실행될때 파일명으로 치환이 되어 버립니다.
그래서 minicalc 2 * 3 이렇게 사용하셔야 됩니다.
이것을 피하고, 편하게 사용하고 싶으시다면…
~/bin/.bash_aliases에
alias minicalc=‘set -o noglob;source ~/bin/minicalc’
이렇게 적어 놓고, minicalc파일의 마지막에 set +o noglob라고 추가로 적으시면 됩니다.