쉘 스크립트로 가능한것들..?

puresupe의 이미지

안녕하세요. 이번학기에 학교에서 유닉스 실습과목을 듣고있는데요. 슬슬 프로젝트를 시작하려고합니다.

계획해둔건

문자열 치환 프로그램 인데요

KMP(문자열검색알고리즘 ) + Regular Expression Engine(간단한) 을 만들어서

$ subst "^a*" "apple" ./* -r

이런식으로 subst "바꿀문자열" "치환할문자열" "경로" "옵션"

이런 걸 생각했었는데요. cvs쓰다가 서버주소가 바뀌어서.. ip주소 다 수정해야할일이 생겨서 거기서 아이디어를 얻얻구요.

그런데 조교님이 bash shell script로 구현하라고 해서요.

사실 제가 쉘스크립트를 이제막 배우는 단계여서.. 위의 프로그램을 C언어로 구현할생각이엇는데 갑자기

쉘스크립트로 프로젝트를 하게되서요.

각설하고. 제 질문은.

셀 스크립트를 이용해서 위와같은걸 만들수있는지 궁금해요. 스크립트를 깊이 배워본적이 없어서

bash shell script 의 역량이 어느정도 되는지 잘 모르겠습니다.

.또. 제 생각에는 file open을 해야할 것같아서. 순수 쉘스크립트로는 구현을 못할것 같은 감만 오는데요..

C언어랑 쉘 스크립트를 섞어쓸수있는지..그런건 어떤식으로 이뤄지는지 간단한 설명 부탁드립니다

planetarium의 이미지

쉘 스크립트 프로그래밍이라 하면 단순히 bash의 내장 기능들만 쓰는것 보다도
sed, awk, grep 등등의 명령등을 활용해서 문제를 처리합니다.
원하시는 기능은 sed 유틸리티에 잘 구현되어 있습니다. 굳이 스크립트 없이 단순 sed 호출만으로 해결 가능할 것 같네요.

bushi의 이미지

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
처럼 bash 만으로 처리할 수 있지만 just for fun 이상도 이하도 아닙니다.

다른 프로그램과 엮어서 쓰는 게 훨씬 편합니다.

$ 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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.