2020-06-06 기준으로 작성되었으며, 블로그 글 작성을 위해 조금 수정되었습니다.
실습문제 10.1~10.3 (교재 333~334P) 풀이
1) 다음과 같은 파일 명령어 메뉴 시스템을 Bash 스크립트로 작성해보자.
우선 vi practice1.bash로 bash를 하나 만든다.
(1) 메뉴화면을 작성하고 출력한다.
(2) 메인 메뉴에서 사용자가 “1”을 입력하면, 다음과 같은 화면이 나온다.
사용자가 디렉터리 이름을 입력하면 해당 디렉터리 내용을 다음과 같이 화면에 출력한다.
메인 메뉴 화면에서 read로 번호를 불러와 ‘num’에 저장한다.
그리고 if문에서 num에 따라 내용이 나오도록 출력한다. 그리고 리스트할 디렉터리를 입력하면 dirname에 저장하고 그 디렉터리의 내용을 ls –l로 출력한다.
(위는 vi편집기에서의 내용, 아래는 출력 내용)
(3) 메인 메뉴에서 사용자가 “2”를 입력하면, 다음과 같은 화면이 나온다.
사용자가 파일 이름을 입력하면, 해당 파일을 지운 후에 메시지를 출력한다.
우선 vi편집기 내용으로는 삭제할 파일을 입력하고 rm –f로 삭제하고 메시지를 출력한다.
아래는 실행 결과이다.
현재 ‘newfile’이라는 파일이 존재한다. 한번 지워보자.
지워진 것을 확인할 수 있다.
(4) 메인 메뉴에서 사용자가 “3”를 입력하면, 다음과 같은 화면이 나온다.
사용자가 파일 이름을 입력하면, 에디터를 사용하여 해당 파일을 연다.
파일을 입력하면 vi편집기로 파일을 연다.
실행 결과
다시 ‘newfile’이 생긴 것을 볼 수 있다.
(5) 메인 메뉴에서 사용자가 “4”를 입력하면, 다음과 같은 화면이 나온다.
사용자가 파일 이름을 입력하면, 해당 파일 내용을 페이지 단위로 보여준다.
파일을 입력하면 cat으로 보여주는데 파이프를 통해 페이지 단위로 볼 수 있게한다.
실행 결과
(6) 메인 메뉴에서 “5”를 입력하면, 종료한다.
그냥 종료 메시지만 띄우면 알아서 종료한다.
추가로 vi편집기 캡처는 안했지만 1~5번이 아니라 다른 단어가 나오면 이렇게 출력한다.
2) 파일과 서브디렉터리 삭제
명령줄 인수로 받은 디렉터리 내의 각 파일과 서브디렉터리에 대해서 삭제 여부를 물은 후 yes로 답한 것들은 지우는 Bash 스크립트를 작성하시오. 명령줄 인수가 없을 때는 현재 디렉터리를 대상으로 한다.
우선 alias rm –ri로 디렉터리 내의 각 파일과 서브 디렉터리에 대해 삭제 여부를 묻는 delete 명령어를 만든다. 이제 폴더와 파일들을 만들고 delete 명령어를 사용해보자.
이렇게 하면 간단하면서도 잘 작동하는 것을 확인할 수 있다.
하지만 이러한 방식이 아니라 다른 방식으로도 풀게 하는 게 이 문제의 목적이다.
그래서 10.3에서는 다른 방식으로 문제를 풀어보자.
참고로 다른 방식은 편집기를 이용해 처음 인수받은 명령줄을 검사해 없으면 현재 문서, 있으면 그 명령줄에 적혀있는 폴더를 열어 파일과 폴더들을 삭제하면 된다.
3) 파일과 하위 디렉터리 삭제
실습문제 2번을 명령줄 인수로 받은 디렉터리 내의 각 파일과 모든 하위 디렉터리에 대해서 삭제 여부를 물은 후 yes로 답한 것들은 지우도록 리커전을 사용하여 확장하시오.
우선 vi편집기로 Delete.bash를 작성하자.
cd $1 → 명령줄 인수로 받은 디렉터리로 이동한다.
for file in * → 그 디렉터리 안의 파일로 반복문 실행
만약 파일일 경우에는 yes로 답하면 삭제
디렉터리라면 다시 Delete.bash ($1 == $file)로 파일을 실행시킨다.
그러면 리커전, 재귀함수가 된다.(재귀함수가 끝나면 rm –ri로 하위폴더도 지울 수 있다. 애초에 파일이 존재하면 폴더를 지울 수 없기 때문에 여기다가 적는 것이 맞다.)
밑은 실행 결과이다.
우선 newdir1에 dir1과 fi1 fi2 fi3이 들어있으며 dir1에 fi4가 들어있다.
여기서 Delete.bash를 delete로 사용할 수 있게 명령어를 지정해주고 권한도 준다.
이제 delete newdir1을 해보면 차례대로 삭제 되는 것을 확인할 수 있다.10.1) 다음과 같은 파일 명령어 메뉴 시스템을 Bash 스크립트로 작성해보자.