쉘 스크립트 조언 부탁드립니다.

gorogong의 이미지

아래와 같이 찾는 값이 없는 경우 "could not found available IP"를 출력 해보려 하는데 조언좀 부탁드립니다.

PS3="Select the option List or Exit  "
DATE=$(date +"%F")
 
 
select var in "1, List" "2, Exit"
 
do
   case $var in
 
   1* ) cat /tmp/ip_list_$DATE |grep --color=always available &&
           if [ $? = 1]
		   then
		   echo "Could not found available IP"	 
           fi		 
		   ;;
   ##"위 grep 결과가 1일때 could not found available IP"
   2* ) break ;;
   *) echo "!!Error select correctly number!!"
   esac
 
 
done
chanik의 이미지

10번째줄 끝의 && 를 제거하고
11번째줄의 "1]" 를 "1 ]" 로 바꾸시면 원하시는대로 될 것 같습니다.

참고로 && 를 쓰려면 따로 if문을 쓸 필요 없이, 이를테면 아래와 같이 쓸 수 있습니다.

cat /tmp/ip_list_$DATE |grep --color=always available && echo FOUND || echo NOT FOUND

대충 아래와 같은 의미가 될 것이고요.

cat /tmp/ip_list_$DATE |grep --color=always available
if [ $? = 0 ]
then
  echo FOUND
else
  echo NOT FOUND
fi

&&, ||를 꼭 섞어야 하는 건 아니고, 둘 중 하나만 써도 됩니다.

김정균의 이미지

기왕 처리하는 거라면 예외 처리도 잘 해 주는 것이 좋겠죠.

기존 처럼 코드를 사용하면 /tmp/ip_list_$DATE 가 없을 경우 에러 메시지가 출력 될 테고, grep 조건을 만족 한다면 avablable 라인이 출력이 되겠죠. 그러므로 다음과 같이 예외 처리를 해 주면 깔끔하게 됩니다.

cat /tmp/ip_list_$DATE 2> /dev/null | grep -q available
if [[ $? == 0 ]]; then
    echo "FOUND"
else
    echo "NOT FOUND"
fi

그리고, 명령행도.. grep 을 pipe 로 데이터를 받으면 cat과 grep 2개의 명령을 실행해야 하게 됩니다. 일반적인 환경에서는 무리가 없는데, load 가 높은 서버에서 사용할 스크립트의 경우에는 pipe 로 넘기는 방법이 수행 시간을 굉장히 많이 잡아 먹을 수 있습니다. 이 명령을 최적화를 하면 다음과 같이 할 수도 있습니다.

cat /tmp/ip_list_$DATE 2> /dev/null | grep -q available
grep -q available 2> /dev/null < /tmp/ip_list_$DATE

cat 을 이용하여 PIPE 를 통해서 넘기지 않고, "<" 키워드를 이용하여 stdin 으로 통하여 grep 으로 직접 넘겨주면 cat 을 한번 덜 실행해도 되므로 부하가 높은 시스템에서 기존 보다 훨씬 가볍게 동작이 가능 합니다.

그리고, if 문에서 사용하는 test 기호 "[" 는 실제 syntax 가 아니라 /bin/[ 명령 입니다. 그러므로 Bash 3부터 지원하는 "[[ ]]" syntax 를 사용하면 좀 더 가볍고 && || 연산 기호도 사용할 수 있습니다.

[ "$A" = "1" ] && [ -z "$B" ] && echo "y"
[ "$A" = "1" -a -z "$B" ] && echo "y"
[[ $A == 1 && -z $B ]] && echo "y"

위의 3가지 표현은 같은 의미 입니다.
그리고 "[" 와 "[[" 문법의 가장 큰 차이중의 하나가 바로 -z "$B" 인데요.. "[" 를 이용한 테스트를 할 경우에는 -z 즉 $B 에 값이 없으면 -z 뒤에 인자가 없는 것으로 간주가 되어 에러가 발생합니다. 그러므로 꼭 변수 quoting을 꼭 주어야 하는데요. "[[" 의 경우는 syntax 이기 때문에 빈 변수를 quoting 해 주지 않아도 된다는 장점이 있습니다. bash2 와 같이 아주 오래된 legacy shell 을 사용하지 않는다면.. "[" 는 버리고 "[[" 를 습관하 해 주시는 것이 더 좋습니다.

gorogong의 이미지

조언 해주신 대로 응용해서 해볼게요 감사합니다!

gorogong의 이미지

조언 정말 감사드립니다 ㅠㅠ!

댓글 달기

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