쉘 스크립트로 가능한것들..?
글쓴이: puresupe / 작성시간: 금, 2009/10/30 - 8:31오후
안녕하세요. 이번학기에 학교에서 유닉스 실습과목을 듣고있는데요. 슬슬 프로젝트를 시작하려고합니다.
계획해둔건
문자열 치환 프로그램 인데요
KMP(문자열검색알고리즘 ) + Regular Expression Engine(간단한) 을 만들어서
$ subst "^a*" "apple" ./* -r
이런식으로 subst "바꿀문자열" "치환할문자열" "경로" "옵션"
이런 걸 생각했었는데요. cvs쓰다가 서버주소가 바뀌어서.. ip주소 다 수정해야할일이 생겨서 거기서 아이디어를 얻얻구요.
그런데 조교님이 bash shell script로 구현하라고 해서요.
사실 제가 쉘스크립트를 이제막 배우는 단계여서.. 위의 프로그램을 C언어로 구현할생각이엇는데 갑자기
쉘스크립트로 프로젝트를 하게되서요.
각설하고. 제 질문은.
셀 스크립트를 이용해서 위와같은걸 만들수있는지 궁금해요. 스크립트를 깊이 배워본적이 없어서
bash shell script 의 역량이 어느정도 되는지 잘 모르겠습니다.
.또. 제 생각에는 file open을 해야할 것같아서. 순수 쉘스크립트로는 구현을 못할것 같은 감만 오는데요..
C언어랑 쉘 스크립트를 섞어쓸수있는지..그런건 어떤식으로 이뤄지는지 간단한 설명 부탁드립니다
Forums:


쉘 스크립트
쉘 스크립트 프로그래밍이라 하면 단순히 bash의 내장 기능들만 쓰는것 보다도
sed, awk, grep 등등의 명령등을 활용해서 문제를 처리합니다.
원하시는 기능은 sed 유틸리티에 잘 구현되어 있습니다. 굳이 스크립트 없이 단순 sed 호출만으로 해결 가능할 것 같네요.
bash 만으로
bash 만으로 불가능하다는 뜻은 아니고,
bash 만 사용해서 스크립트를 만들면 유연하지 못하다는 뜻입니다.
말씀하신 내용은
#!/bin/bash # for CVS/Root declare -r VICTIM_DIR="CVS" declare -r VICTIM_FILE="Root" replace_CVS_host() { local F local OLD_IFS local NEWHOST # :pserver:aaa@bbb.com:/mnt/cvs local A local TYPE="A[1]" local ACCOUNT="A[2]" local CVSHOST="A[3]" local CVSROOT="A[4]" NEWHOST=${1} F=${2} read A < ${F} OLD_IFS=${IFS} IFS=':@' A=(${A}) IFS=${OLD_IFS} echo :${!TYPE}:${!ACCOUNT}@${NEWHOST}:${!CVSROOT} > ${F} || return 0 return 1 } check_and_process_file() { local D local F local NEWHOST=${1} local COUNT=0 while read D do F="${D}/${VICTIM_FILE}" [ ! -f ${F} ] && continue replace_CVS_host ${NEWHOST} $F COUNT=$((COUNT + $?)) done return ${COUNT} } my_find_dir() { local DNAME=${1} local A=$(echo *) local E for E in ${A} do pushd ${E} > /dev/null 2>&1 [ $? != 0 ] && continue; [ x${E} == x${DNAME} ] && echo ${PWD} || my_find_dir ${DNAME} popd > /dev/null 2>&1 done } NEWHOST=${1:?"<newhost> [topdir]"} TOPDIR=${2:-"./"} pushd ${TOPDIR} > /dev/null || exit 1 my_find_dir ${VICTIM_DIR} | check_and_process_file ${NEWHOST} echo "${PWD}: $? files" popd > /dev/null다른 프로그램과 엮어서 쓰는 게 훨씬 편합니다.
$ find ./ -name CVS -type d -exec \ bash -c "read A < {}/Root;echo ${A/pserver:*@*:/pserver:new@new.addr:} > {}/Root" \;덧붙여,
출장지에서 사내 CVS서버에 붙기위해 썼던 꼼수인데,
/etc/hosts 에
111.222.333.444 cvs.priv
정도로 등록하고 cvs.priv 주소로 checkout 해서 편하게 썼습니다.
출장지에선 ssh 터널을 뚫고 /etc/hosts 의 ip주소만 127.0.0.1 로 변경.
OTL
댓글 달기