7. 예제

7.1. 일반적인 쉘프로그램의 구조

이번장에서는 그동안 배웠던 기본적인 내용들을 토대로, 실질적인 쉘프로그램을 만들도록 해보자. 모든 종류의 훌륭한 쉘스크립트는 도움말을 가지고 있으며, 아규먼트옵션을 파싱하는 일반적인 루틴을 가지고 있다. 이번에 새로만들 스크립트는 이러한 좋은 스크립 트가 가지는 루틴들을 포함하게 될것이다.

7.2. 바이너리를 10진수로 바꿔주는

이 스크립트는 바이너리를 숫자로 바꿔주는 일을한다. 간단한 산수 게산을 위해서 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"
		
위의 프로그램은 이른바 2진수를 10진수로 바꾸어주는 프로그램이다. 만약에 위의 스크립트로 주어진 아규먼트가 1101 이라면, 2진수를 10진수로 바꾸는 계산법에 의해서 아래와 같은 결과가 나오게 될것이다.
	1*2^3 + 1*2^2 + 0*2 + 1 = 6
		
위 프로그램의 분석은 여러분 각자에게 맡기겠다.

7.3. 디버깅

디버깅을 위한 가장간단한 방법은 echo 명령을 이용해서 결과값을 출력해보는 방법이다. - 이방법은 다른 모든 언어에도 공통적으로 적용된다. C는 printf, Perl은 print 등이 될것이다 - 당신은 echo 를 이용해서 변수값을 알아봄으로써, 어느부분에서 실수를 했는지를 알수 있다. 아마도 대부분의 쉘 프로그래머는 이러한 실수를 찾는데 전체 프로그램을 짜는 시간의 80% 정도를 보낼것이다. 쉘스크립트의 잇점은 이러한 테스트를 위해서 echo 문을 사용하는데, 다시 컴파일할 필요가 없어서, 시간을 절약할수 있다라는 것이다.

쉘스크립트를 디버깅 모드로 돌리고 싶다면 아래와 같이 하면 된다. 디버깅 하고자 하는 쉘스크립트의 이름은 strangescript 라고 하자.
	sh -x strangescript
			
위와 같이 스크립트를 실행하면, 쉘이 실행되는 동안에 사용된 변수의 모든 값을 화면상에 출력시켜준다. 그럼으로 어느 곳에서 실수를 했는지 쉽게 찾을수 있다.

	sh -n strangescript
			
위와 같이 "-n" 옵션을 이용하면 syntax 오류를 찾아낼수 있다. 위의 옵션에서는 syntax 오류 외의 다른 값들은 보여주지 않는다.