이번장에서는 그동안 배웠던 기본적인 내용들을 토대로, 실질적인 쉘프로그램을 만들도록 해보자. 모든 종류의 훌륭한 쉘스크립트는 도움말을 가지고 있으며, 아규먼트옵션을 파싱하는 일반적인 루틴을 가지고 있다. 이번에 새로만들 스크립트는 이러한 좋은 스크립 트가 가지는 루틴들을 포함하게 될것이다.
이 스크립트는 바이너리를 숫자로 바꿔주는 일을한다. 간단한 산수 게산을 위해서 expr 을 사용하도록 한다.
#!/bin/sh help() { cat << HELP b2h -- convert binary to decimal USAGE: b2h [-h] binarynum OPTIONS: -h help text EXAMPLE: b2h 111010 whill return 58 HELP exit 0 } error() { # print an error and exit echo "$1" exit 1 } lastchar() { #return the last character of a string in $rval if [ -z "$1" ] then rval="" return fi numofchar=`echo -n "$1" | wc -c | sed 's/ //g'` rval=`echo -n "$1" | cut -b $numofchar` } chop() { # remove the last character in string and return it in $rval if [ -z "$1" ] then # empty string rval="" return fi # wc puts some space behind the output this is why we need sed: numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` if [ "$numofchar" = "1" ] then # only one char in string rval="" return fi numofcharminus1=`expr $numofchar "-" 1` # now cut all but the last char: rval=`echo -n "$1" | cut -b 0-${numofcharminus1}` } while [ -n "$1" ] do case $1 in -h) help;shift 1;; # function help is called --) shift;break;; # end of options -*) error "error: no such option $1. -h for help";; *) break;; esac done # The main program sum=0 weight=1 # one arg must be given: [ -z "$1" ] && help binnum="$1" binnumorig="$1" while [ -n "$binnum" ]; do lastchar "$binnum" if [ "$rval" = "1" ] then sum=`expr "$weight" "+" "$sum"` fi # remove the last position in $binnum chop "$binnum" binnum="$rval" weight=`expr "$weight" "*" 2` done echo "binary $binnumorig is decimal $sum" |
1*2^3 + 1*2^2 + 0*2 + 1 = 6 |
디버깅을 위한 가장간단한 방법은 echo 명령을 이용해서 결과값을 출력해보는 방법이다. - 이방법은 다른 모든 언어에도 공통적으로 적용된다. C는 printf, Perl은 print 등이 될것이다 - 당신은 echo 를 이용해서 변수값을 알아봄으로써, 어느부분에서 실수를 했는지를 알수 있다. 아마도 대부분의 쉘 프로그래머는 이러한 실수를 찾는데 전체 프로그램을 짜는 시간의 80% 정도를 보낼것이다. 쉘스크립트의 잇점은 이러한 테스트를 위해서 echo 문을 사용하는데, 다시 컴파일할 필요가 없어서, 시간을 절약할수 있다라는 것이다.
쉘스크립트를 디버깅 모드로 돌리고 싶다면 아래와 같이 하면 된다. 디버깅 하고자 하는 쉘스크립트의 이름은 strangescript 라고 하자.
sh -x strangescript |
sh -n strangescript |