리눅스 getopt

cis07385의 이미지

제가 getopt함수를 써서 ls 구현을 하는 중인데,
ls -l과
ls -R은 잘 나옵니다.
그런데 ls -lR을 치면 계속 오류가 뜹니다.
getopt 파라미터에서 한글자 밖에 안받는거 같은데...
case 'l' : myls_l();break;
case 'R' : myls_R();break;

여기서 lR을 받으면 myls_lR()함수를 실행시키고 싶은데 어떻게 해야될지 감이 안옵니다... 꼭 getopt써서 하고 싶은데... ㅠㅠ

김정균의 이미지

getopt 로 옵션을 2개로 받을 수는 없습니다.
그러므로

case 'I' : myls_I(); break

로 호출을 하지 말고,

case 'I' : optI=1; break

이런식으로 하여

if [ $optI -eq 1 -a $optR -eq 1 ]; then
    my_lsIR();
fi

이렇게 구동 되도록 만들어야 합니다.

그리고, 님처럼 옵션별로 함수를 별도로 만드시면, 옵션의 조합만큼 함수가 필요하기 때문에 매우 비 효율적이게 코딩이 될 수 있습니다.

옵션 별로 함수를 만들 것이 아니라, 출력 시에 옵션 별로 조건문을 이용하여 출력이 되도록 작성 하세요.

swish95의 이미지

참고로 말씀드리면
옵션 처리는 김정균님 말씀대로 하되
my_lsIR 함수를 별도로 만들기 보다는
'l', 'R' 의 각 플래그값에 따라 두개가 동시에 실행되도록 함수를 구현해보세요

------------------------------------------------------------
ProgrammingHolic

swish95의 이미지

위의 댓글에 있는데 또 썻는데 수정이 안되네요 ^^

------------------------------------------------------------
ProgrammingHolic

cogniti3의 이미지

https://pubs.opengroup.org/onlinepubs/009695399/functions/getopt.html 에 예제 코드가 있습니다. 참고하시기 바랍니다. getopt 함수를 활용하여 아래처럼 옵션 주는게 가능한거 같네요.

cmd -ao arg path path
cmd -a -o arg path path
cmd -o arg -a path path
cmd -a -o arg -- path path
cmd -a -oarg path path
cmd -aoarg path path
김정균의 이미지

질문의 의도는, command line에서 옵션을 어떻게 주느냐가 아니라, 프로그램의 getopt 로 넘어온 옵션에 대해 문의 하는 겁니다. 즉, -ab 로 옵션을 주었을때, getopt 는 -a 와 -b 로 나누어 처리를 하는데 -ab 하나로 처리가 가능 하냐고 문의한 것이고, GNU getopt 나 BSD getopt 는 불가능 합니다. -ab 나 -a -b 로 모두 getopt 는 -a, -b 로 처리를 해야 합니다.

P.S.
getopt 동작 관련 내용은 cogniti3 님에게 답변한 것이 아니라 쓰레드를 읽는 분들 위하여 첨언한 것입니다.

cogniti3의 이미지

아... 그렇네요.. 제가 질문의 의도를 잘못 파악했습니다. 요새 자꾸 동문서답을 해서 죄송합니다;;;

댓글 달기

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