linux shell script에서

somedayhow의 이미지

shell script 해석이 안되서 애를 먹고 있습니다.

beginning linux programming 이라는 책을 보면서 하고 있는데 생각보다 어렵네요 ㅠ

#!/bin/sh
 
if [ "$1" = clean ]; then
    rm -f *.log *.dat target.txt
    exit
fi
 
num=1
length=1000
period=50
 
cat <<EOS | python > target.txt

여기서 if ["$1" =clean ]; then
은 "$1"은 스크립트에 주어진 매개변수라고 적혀있는데
어디서 매개변수가 정의되어있거나 받아오는건가요?

그리고 clean이랑 비교하라는 것은 무슨의미인지 잘 모르겠습니다.
비어있는지를 확인하라는 걸까요?

검색해보니 그럴경우에는
if ["$1"="xABC"]으로 비어있는지 확인한다고 나와있는데 clean은 검색을 해봐도 잘 안나오네요..

그리고 cat< target.txt
이 부분은

EOS와 python을 파이프로 연결을 하고 target.txt.에 입력하라는거 같은데
python을 이용해서 무언가를 작성하고 target.txt에 입력을 하는 명령인거 같은데 이게 정확히 무슨뜻인지는 잘 모르겠습니다.
여기서 EOS란 무엇인가요?

cat <<EOS | python > target.txt
import sys,math,random
funcs = [
    lambda t : (0.8 * math.sin(t), 0.8 * math.cos(t)),
    lambda t : (0.3 * math.sin(t), 0.3 * math.cos(t)),
    lambda t : (0.8 * math.sin(3 * t), 0.8 * math.cos(t)),
    lambda t : (0.8 * math.cos(t), 0.8 * math.sin(3 * t)),
 
    lambda t : (0.4 * math.sin(2 * t) + 0.4, 0.8 * math.cos(t)),
    lambda t : (0.4 * math.sin(2 * t) - 0.4, 0.8 * math.cos(t)),
    lambda t : (0.8 * math.sin(2 * t), 0.4 * math.cos(t) + 0.4),
    lambda t : (0.8 * math.sin(2 * t), 0.4 * math.cos(t) - 0.4),
 
    lambda t : (0.4 * math.cos(t) + 0.4, 0.8 * math.sin(2 * t)),
    lambda t : (0.4 * math.cos(t) - 0.4, 0.8 * math.sin(2 * t)),
    lambda t : (0.8 * math.cos(t), 0.4 * math.sin(2 * t) + 0.4),
    lambda t : (0.8 * math.cos(t), 0.4 * math.sin(2 * t) - 0.4),
 
    lambda t : (0.4 * math.sin(t) + 0.4, 0.8 * math.cos(t)),
    lambda t : (0.4 * math.sin(t) - 0.4, 0.8 * math.cos(t)),
    lambda t : (0.8 * math.sin(t), 0.4 * math.cos(t) - 0.4),
    lambda t : (0.8 * math.sin(t), 0.4 * math.cos(t) + 0.4),
 
    lambda t : (0.8 * math.sin(t), 0.8 * math.cos(2 * t)),
    lambda t : (0.8 * math.sin(t), -0.8 * math.cos(2 * t)),
    lambda t : (0.8 * math.cos(2 * t), 0.8 * math.sin(t)),
    lambda t : (-0.8 * math.cos(2 * t), 0.8 * math.sin(t)),
 
    lambda t : (0.3 * math.sin(t) + 0.5, 0.3 * math.cos(t) + 0.5),
    lambda t : (0.3 * math.sin(t) + 0.5, 0.3 * math.cos(t) - 0.5),
    lambda t : (0.3 * math.sin(t) - 0.5, 0.3 * math.cos(t) + 0.5),
    lambda t : (0.3 * math.sin(t) - 0.5, 0.3 * math.cos(t) - 0.5)
]
def gen_sigma():
    sigma = [0.01, 0.05]
    n = 0
    while True:
        yield sigma[n % len(sigma)]
        n += 1
gen = gen_sigma()
 
for f in funcs:
    sigma = gen.next()
    for n in xrange($num):
        m = random.randint(0, 1000)
        for t in [x * ((2 * math.pi) / $period) for x in xrange(m, $length+m)]:
            print '\t'.join([str(x + random.gauss(0, sigma)) for x in f(t)])
        print '\n'
EOS

if [ x'which rnn-learn' == x] ; then
    path1=../../src/rnn-learn/
else
    path1=
fi
${path1}rnn-learn -c config.txt target.txt

작은 따옴표는 무슨 기능을 하나요?
그리고 which라는건 경로를 가리키는 역할을 하는 단어인지 아니면 그냥 의미없는 단어일까요?

책에서 보면

#!/bin/sh
 
cat <<!FUNKY!
~
~
~
!FUNKY!

라 적혀있고

여기서 느낌표와 대문자는 여기 문서 텍스트와의 구별을 위해 쓰였다는데
무슨 소리인지..

제 프로그래밍 이해능력이 떨어지는거 같아서 질문을 한가지 더 드립니다.
이 책보다 좀 더 쉽고 자세하게 설명을 해놓은 리눅스 책이 있을까요?
책을 봐도 이해가 잘 안됩니다.ㅠ
검색해도 잘 못찾겠네요

익명 사용자의 이미지

> 어디서 매개변수가 정의되어있거나 받아오는건가요?

매개 변수는 실행시에 커맨드 라인 인자로 주어집니다.
예를 들어 abc.sh라는 파일에 스크립트가 들어있다고 하지요.
커맨드 라인에서 abc.sh hello world 라고 입력해서 이 스크립트를 실행했다면 $1은 "hello" 이고, $2는 "world"가 됩니다.

> 그리고 clean이랑 비교하라는 것은 무슨의미인지 잘 모르겠습니다.

그냥 문자열 "clean"과 비교하는 겁니다. 따옴표가 있으면 더 명확했을텐데 없어도 string literal로 취급됩니다.

> 여기서 느낌표와 대문자는 여기 문서 텍스트와의 구별을 위해 쓰였다는데

"여기 문서 텍스트"는 "here document"를 해석한 말인 것 같군요.
http://en.wikipedia.org/wiki/Here_document 를 읽어보시면 도움이 될 겁니다.
EOS나 !FUNKY!는 그 문자열(here document)의 끝을 표시하기 위한 identifier입니다.
<

> 작은 따옴표는 무슨 기능을 하나요?

작은 따옴표 역시 문자열을 나타냅니다. 큰 따옴표를 사용하면 변수 치환이 일어나지만 작은 따옴표를 사용하면 그렇지 않습니다.
예를 들어 x="hello"; y="abc $x"; z='abc $x' 에서 y의 내용은 "abc hello"이고, z의 내용은 "abc $x"입니다.

> 그리고 which라는건 경로를 가리키는 역할을 하는 단어인지 아니면 그냥 의미없는 단어일까요?

which는 명령어입니다. 인자로 받은 실행 파일의 위치를 알려줍니다. man which 해보세요.
그런데 인용하신 스크립트에서 which를 사용하는 방법은 잘 이해가 안되네요.
[ x'which rnn-learn' == x ] 이 아니라 [ x$(which rnn-learn) == x ] 이어야 될 것 같습니다만.

익명 사용자의 이미지

엇, here document를 설명한 부분이 깨졌군요.
cmd <<XXX 를 사용하면 "그 다음 줄"의 시작부터 XXX까지의 내용이 cmd의 표준 입력으로 들어가게 됩니다.
XXX는 아무 문자열이나 상관없습니다. here document의 끝을 표시하기위한 identifier를 정해주는 겁니다.
"그 다음 줄"부터 시작하기 때문에 파이프를 사용해서 python에 전달할 수 있습니다.
하지만 왜 굳이 cat을 사용했는지 궁금하네요. 그냥 python > target.txt <

익명 사용자의 이미지

부주의로 또 깨졌네요. cat 없이
python > target.txt <<EOS ...
로 해도 될 겁니다. 한 번 테스트해보세요.

somedayhow의 이미지

알고 싶었던것을 드디어 알게되었습니다.

그런데 한가지 더 물어봐도 될까요?

/bin/sh start.sh 로 위 파일을 실행하면

마지막줄에서
syntx error : unexpected end of file이라고 나옵니다

이 메시지가 몇번 나왔을때는 그냥 공백을 다 없어버리니 없어졌는데

마지막줄뒤에 공백을 다 없애도 이 메시지는 그냥 나옵니다.

${path1}rnn-learn -c config.txt target.txt

이렇게 끝내면 안되는 건가요?

위에 if문은 fi로 끝났는데 뭐가 문제인지 모르겠습니다.

혹시 EOS부터 EOS까지 모두 vim에서 붉은색으로 나오는데 이 안에서 뭔가 문제가 있나요?

----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를

glay의 이미지

bash 에서 debug 를 할 경우

bash -x file.sh 하시면 됩니다.

그러면 어느 부분에서 syntax 가 나오는지 알 수 있을 것입니다.

그리고 위에서 보면 EOS 라고 되어 있는데 이게 오타 일꺼 같습니다. EOF 일껍니다. ( end of file? )

EOF 의 경우 EOF 로 시작해서 EOF 로 끝나야 합니다. 그런데 마지막에 EOF 가 없어서 나는 에러입니다.

일단 debug 하시고 bash EOF 등으로 검색하시면 예제 많이 나와 있으니 어렵지 않으실껍니다.

cat > filename.sh << EOF
echo 어쩌구저쩌구
echo 저쩌구어쩌구
echo 아싸좋다
EOF

이러면 filename.sh 에 echo 의 내용이 다 들어가고 EOF 에서 끝나는 것이죠 ;; ( 에구 쑥스럽;; )


--------------- 절취선 ------------------------
하늘은 스스로 삽질하는 자를 삽으로 팬다.

http://glay.pe.kr

익명 사용자의 이미지

EOF 아니어도 관계없습니다. 아무 문자열이나 상관없습니다. here document에 대해서 찾아보세요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.