for문에서 null 변수를 처리하려면? 원문 제목 : if 문 null 값 처리 오류?

help@osori.org의 이미지

이번엔 if문 에러내요.

작성한 스크립트는 다음과 같습니다.

#!/bin/bash
 
LOGHOME=/var/log/httpd
LOGFILE=/var/log/httpd/access_log
 
ERRORCODE1=`cat $LOGHOME/access_log | awk '$9 ~ /304/ {print $7}'| sort -u`
ERRORCODE2=`cat $LOGHOME/access_log | awk '$9 ~ /400/ {print $7}'| sort -u`
ERRORCODE3=`cat $LOGHOME/access_log | awk '$9 ~ /401/ {print $7}'| sort -u`
ERRORCODE4=`cat $LOGHOME/access_log | awk '$9 ~ /403/ {print $7}'| sort -u`
ERRORCODE5=`cat $LOGHOME/access_log | awk '$9 ~ /404/ {print $7}'| sort -u`
ERRORCODE6=`cat $LOGHOME/access_log | awk '$9 ~ /405/ {print $7}'| sort -u`
ERRORCODE7=`cat $LOGHOME/access_log | awk '$9 ~ /406/ {print $7}'| sort -u`
ERRORCODE8=`cat $LOGHOME/access_log | awk '$9 ~ /408/ {print $7}'| sort -u`
ERRORCODE9=`cat $LOGHOME/access_log | awk '$9 ~ /500/ {print $7}'| sort -u`
 
 
echo "################### This is ERROR CODE 400 ##################"
echo ""
 
for LIST in $ERRORCODE2
 
do
        if [ -z $LIST ]; then
 
                echo "Do not exist Error Code 400"
        else
                echo "error code 400 list is -> $LIST"
                echo -n "error total is -> "
                cat $LOGFILE | awk '$9 ~ /400/ {print $0}' | grep $LIST | wc -l
                echo ""
        fi
done

결과 값은 Do not exist Error Code 400 이라고 나와야 합니다.

access_log 에 400 에러가 없거든요.

하지만 결과는 다음과 같이 아무 결과가 없습니다.

[root@Asianux2 ~/bin]# error_check2
################### This is ERROR CODE 400 ##################
 
[root@Asianux2 ~/bin]# 

무슨 문제일까요 --;

Quote:
1. 원인 $ERRORCODE2
Submitted by redneval on 목, 2007/08/30 - 11:34am.

1. 원인

$ERRORCODE2 값이 존재하지 않는다면 for 루프는 실행되지 않겠군요.

이렇게만 알려드리면 이해하시겠죠?

2. 디버깅하기

$ bash -v -x test.sh

참고 : http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html

3. 추천 문서

http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
»

* 답글
* 0 points

help@osori.org의 이미지
185
points
아.. 변수 값이 null 이기 때문에 for문의 루프가 실행되지 않았군요.
Submitted by help@osori.org on 목, 2007/08/30 - 3:10pm.

그러면 제가 원하는대로 되혀면 어떻게 해야 할까요.

변수 값이 null 일땐 if문 이하의 then 구절이 실행되고

변수 값이 있을땐 else 구문을 실행하고자 하는데.

if문 만으로는 변수 값들이 하나씩 들어오지 않고 한꺼번에 들어와서
"too many arguments"

라는 에러가 생기고..

변수를 하나씩 넘겨주기위해 for문을 쓰자니

변구 값이 null일땐 for문이 실행이 않되고..

어떻게 접근해야 할까요?

김정균의 이미지


if [ -z $LIST ]; then

구분이 오류가 발생하여 test fail 로 판정하여 else 문이 실행이 된 것입니다. 즉 syntax 오류라는 얘기죠. 문서를 잘 읽어 보시면 string test 시에는 quoting 을 하라는 문구가 있을 겁니다. 즉

if [ -z "$LIST" ]; then

이렇게 하셔야지 오류가 발생하지 않습니다.

help@osori.org의 이미지

$LIST 변수를 "" 처리해도 마찬가지로 아무결과도 나타나질 않내요.. ㅡㅜ

혹시 어떤 라인에서 어떤 오류가 있는지 디버깅 비슷한 과정이 없을까요 --;

help@osori.org의 이미지

sh -x 스크립트명 : 스크립트내 변수 체크.
sh -n 스크립트명 : 구문 오류 검사.

모두 별다른 이상은 없다고 나오는데요 ㅡㅜ

redneval의 이미지

1. 원인

$ERRORCODE2 값이 존재하지 않는다면 for 루프는 실행되지 않겠군요.

이렇게만 알려드리면 이해하시겠죠?

2. 디버깅하기

$ bash -v -x test.sh

참고 : http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html

3. 추천 문서

http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf

help@osori.org의 이미지

그러면 제가 원하는대로 되혀면 어떻게 해야 할까요.

변수 값이 null 일땐 if문 이하의 then 구절이 실행되고

변수 값이 있을땐 else 구문을 실행하고자 하는데.

if문 만으로는 변수 값들이 하나씩 들어오지 않고 한꺼번에 들어와서
"too many arguments"

라는 에러가 생기고..

변수를 하나씩 넘겨주기위해 for문을 쓰자니

변구 값이 null일땐 for문이 실행이 않되고..

어떻게 접근해야 할까요?

경의 이미지

전체적으로 정리가 더 돼야 할 것 같습니다.
일단 이대로 동작하려면,

Quote:
for LIST in $ERRORCODE2

에서도
for LIST in "$ERRORCODE2"
처럼 인용을 해야 합니다.
근데 여기서는 괜히 시간만 낭비하고 있습니다.
만약에,
ERRORCODES="304 400 401 403 404 405 406 408 500"
for CODE in $ERRORCODES
do
export CODE=$CODE
LIST=`cat $LOGFILE | awk '$9 ~ /'"${CODE}"'/ { print $7 }' | uniq | sort -u`
...................
done
이런 식으로 처리한다면 for 문이 유용할 수도 있습니다.

Quote:
awk '$9 ~ /400/ {print $7}'| sort -u`

보다는 awk '$9 ~ /400/ {print $7}'| uniq | sort -u`이 휠씬 빠르더군요.

합계는,
awk '$9 ~ /400/ {total += 1; print $7}; END {print total}' "$LOGHOME/access_log"
로 계산할 수도 있습니다.

awk '$9 ~ /304|400|401\403|404|405|406|408|500/ { count[$9]++ }
처럼 잘 이용해서 한 번에 처리하시고 알려주시기 바랍니다^^.

댓글 달기

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