for문에서 null 변수를 처리하려면? 원문 제목 : if 문 null 값 처리 오류?
이번엔 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]#
무슨 문제일까요 --;
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 pointshelp@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 ];
if [ -z $LIST ]; then
구분이 오류가 발생하여 test fail 로 판정하여 else 문이 실행이 된 것입니다. 즉 syntax 오류라는 얘기죠. 문서를 잘 읽어 보시면 string test 시에는 quoting 을 하라는 문구가 있을 겁니다. 즉
if [ -z "$LIST" ]; then
이렇게 하셔야지 오류가 발생하지 않습니다.
흠...
$LIST 변수를 "" 처리해도 마찬가지로 아무결과도 나타나질 않내요.. ㅡㅜ
혹시 어떤 라인에서 어떤 오류가 있는지 디버깅 비슷한 과정이 없을까요 --;
디버깅을 해봤지만 별다른 소득이 없군요..
sh -x 스크립트명 : 스크립트내 변수 체크.
sh -n 스크립트명 : 구문 오류 검사.
모두 별다른 이상은 없다고 나오는데요 ㅡㅜ
1. 원인 $ERRORCODE2
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
아.. 변수 값이 null 이기 때문에 for문의 루프가 실행되지 않았군요.
그러면 제가 원하는대로 되혀면 어떻게 해야 할까요.
변수 값이 null 일땐 if문 이하의 then 구절이 실행되고
변수 값이 있을땐 else 구문을 실행하고자 하는데.
if문 만으로는 변수 값들이 하나씩 들어오지 않고 한꺼번에 들어와서
"too many arguments"
라는 에러가 생기고..
변수를 하나씩 넘겨주기위해 for문을 쓰자니
변구 값이 null일땐 for문이 실행이 않되고..
어떻게 접근해야 할까요?
전체적으로 정리가
전체적으로 정리가 더 돼야 할 것 같습니다.
일단 이대로 동작하려면,
에서도
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 문이 유용할 수도 있습니다.
보다는 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]++ }
처럼 잘 이용해서 한 번에 처리하시고 알려주시기 바랍니다^^.
댓글 달기