부록 H. 연습문제

다음에 주어진 일들을 수행하는 스크립트를 짜 보세요.

초급

홈디렉토리 목록

사용자의 홈디렉토리 이하 모든 디렉토리의 목록을 나열하고 그 정보를 파일로 저장하세요. 그 다음 그 파일을 압축한 다음에 사용자가 플로피 디스켓을 준비하고 ENTER를 누르게 하세요. 끝으로, 파일을 디스켓으로 저장하세요.

for 루프를 whileuntil 루프로 바꾸기

예 10-1for 루프while 루프로 바꿔보세요. 힌트: 데이타를 배열에 저장하고 각 요소들에 대해 하나씩 처리하세요.

다 했나요? 그럼 이번에는 until 루프로 바꿔보세요.

소수(Primes)

60000 에서 63000 사이에 들어 있는 모든 소수를 표준출력으로 출력하세요. 결과가 깔끔한 형태로 나오도록 해야 합니다(힌트: printf 를 써보세요).

유일한 시스템 ID

여러분의 컴퓨터를 위한 "유일한" 6 자리 16진수 ID를 만들어 보세요. 결함이 많은 hostid 명령어를 쓰지 말고 md5sum /etc/passwd라고 한 다음 그 출력의 첫 6 자리를 쓰면 됩니다.

백업

여러분의 홈디렉토리(/home/your-name)에 들어 있는 파일중에 최근 24시간 동안 변경된 모든 파일을 "타르볼"(*.tar.gz)로 묶으세요. 힌트: find를 쓰세요.

안전한 삭제

이름을 srm.sh로 해서 "안전한" 삭제 명령어를 짜 보세요. 이 스크립트에 명령어줄 인자로 파일명을 적어 주면 그 파일은 지워지지 않고 gzip으로 묶여 /home/username/trash 디렉토리로 이동됩니다. 구동시에는 "trash" 디렉토리를 확인해서 48시간보다 오래된 파일들을 지우도록 하세요.

중급

디스크 공간 관리

/home/username 디렉토리에 들어 있는 파일중에서 100K 보다 큰 모든 파일을 한 번에 하나씩 나열하고 사용자가 그 파일을 지울것인지 압축할 것인지를 물어보게 하세요. 삭제된 모든 파일과 삭제 시간을 로그 파일로 쓰도록 하세요.

잔돈 계산

보통의 상황에서 단지 동전(25 센트까지)만 있다고 할 때, 1.68 달러를 잔돈으로 주려고 한다면 어떻게 해야 잘 줬다고 할 수 있을까요? 25 센트 6개, 10 센트 1개, 5 센트 1개, 3 센트면 되겠죠.

명령어줄에서 임의의 달러와 센트를 입력받아($*.??) 최소한의 동전을 사용해서 잔돈을 계산해 보세요. 여러분이 미국에 살지 않는다면 대신 여러분 나라에서 쓰이는 통화 단위를 쓰세요. 스크립트는 명령어줄 입력을 파싱해야 하고 그것을 최소 화폐 단위의 배수가 되도록 해야 합니다. 힌트: 예 23-4을 보세요.

행운의 숫자

"행운의 숫자"란 각 자리수를 계속 더해서 최종적으로 7 이 되는 숫자를 말합니다. 예를 들어 62431 은 6 + 2 + 4 + 3 + 1 = 16, 1 + 6 = 7 이 되기 때문에 행운의 숫자입니다. 1000 에서 10000 사이에 존재하는 모든 "행운의 숫자"를 찾아보세요.

문자열을 알페벳 순으로 표시하기

명령어줄에서 입력받은 임의의 문자열을 알파벳 순(아스키 순서로)으로 표시하세요.

파싱

/etc/passwd 을 파싱해서 탭이 들어간 보기 좋은 형태로 출력하세요.

데이타 파일을 예쁘게 출력하기

몇몇 데이타베이스와 스프레드시트들은 파일을 콤마로 구분된 값(comma-separated values, CSVs)으로 저장해 줍니다. 다른 어플리케이션에서 종종 이 파일을 파싱할 필요가 있습니다.

필드가 콤마로 구분된 데이타 파일이 다음과 같이 주어졌을때:
Jones,Bill,235 S. Williams St.,Denver,CO,80221,(303) 244-7989
Smith,Tom,404 Polk Ave.,Los Angeles,CA,90003,(213) 879-5612
...
이 데이타에 라벨을 붙이고 동일한 컬럼으로 재정렬해서 표준출력으로 출력해 보세요.

고급

파일 억세스 로깅하기

/etc 디렉토리에 있는 모든 파일에 대한 하루동안의 모든 접근을 로깅하세요. 로그에는 파일이름, 사용자 이름, 접근 시간이 포함되어야 합니다. 파일에 대해서 일어나는 어떤 변경사항이라도 모두 체크되어야 합니다. 이 모든 정보들을 하나의 로그파일에 깔끔한 포맷으로 저장하세요.

주석 지우기

명령어줄에서 주어진 쉘 스크립트에 들어 있는 모든 주석을 지우세요. "#! 이 들어 있는 줄"은 지워지면 안 된다는 것에 주의하세요.

HTML 변환

주어진 텍스트 파일을 HTML로 변환하세요. 이 비대화형 모드 스크립트는 주어진 파일에 대해 자동으로 적절한 HTML 태그를 삽입해야 합니다.

HTML 태그 지우기

주어진 HTML 파일에서 모든 HTML 태그를 지우고 각 줄에 60 에서 75 글자 정도만 들어가도록 하세요. 문단과 블럭 간격을 적당하게 재세팅하고 HTML 테이블은 최대한 비슷한 형태의 텍스트로 변환하세요.

헥사 덤프

주어진 이진 파일에 대해 헥사 덤프를 뜨세요. 출력의 첫번째 필드에는 주소가 오고 다음의 8개 필드에는 4 바이트 헥사값이 오고 마지막 필드에는 앞의 8개 필드에 해당하는 아스키값으 오도록 탭으로 구분하세요.

행렬식

4 x 4 행렬식을 계산하세요.

숨겨진 낱말

"낱말 찾기" 퍼즐(word-find puzzle) 생성기를 짜 보세요. 이 스크립트는 입력된 10개의 낱말을 랜덤한 글자들로 가득찬 10 x 10 행렬에 집어 넣어야 합니다. 이 낱말들은 가로나, 세로, 대각선으로 숨겨져 있을 수 있습니다.

철자 바꾸기(Anagramming)

4 글자짜리 입력을 받아 철자를 바꾸세요. 예를 들어, 입력이 word 라고 하면 do or rod row word 처럼 될 수 있겠죠. 참고 리스트가 필요하다면 /usr/share/dict/linux.words 를 써도 될 겁니다.

여러분이 생각한 해결책을 저자에게 보내지 말아 주세요. 여러분이 영리하다는 것을 저자에게 감동시키려면 차라리 이 책의 버그나 여러 제안들을 보내서 이 책을 더 발전시키는 것이 더 좋은 방법입니다.