쉘 스크립트 조언 부탁드립니다.
글쓴이: gorogong / 작성시간: 목, 2022/03/10 - 12:06오후
아래와 같이 찾는 값이 없는 경우 "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
Forums:
10번째줄 끝의 && 를 제거하고
10번째줄 끝의 && 를 제거하고
11번째줄의 "1]" 를 "1 ]" 로 바꾸시면 원하시는대로 될 것 같습니다.
참고로 && 를 쓰려면 따로 if문을 쓸 필요 없이, 이를테면 아래와 같이 쓸 수 있습니다.
대충 아래와 같은 의미가 될 것이고요.
&&, ||를 꼭 섞어야 하는 건 아니고, 둘 중 하나만 써도 됩니다.
기왕 처리하는 거라면 예외 처리도 잘 해 주는 것이
기왕 처리하는 거라면 예외 처리도 잘 해 주는 것이 좋겠죠.
기존 처럼 코드를 사용하면 /tmp/ip_list_$DATE 가 없을 경우 에러 메시지가 출력 될 테고, grep 조건을 만족 한다면 avablable 라인이 출력이 되겠죠. 그러므로 다음과 같이 예외 처리를 해 주면 깔끔하게 됩니다.
그리고, 명령행도.. grep 을 pipe 로 데이터를 받으면 cat과 grep 2개의 명령을 실행해야 하게 됩니다. 일반적인 환경에서는 무리가 없는데, load 가 높은 서버에서 사용할 스크립트의 경우에는 pipe 로 넘기는 방법이 수행 시간을 굉장히 많이 잡아 먹을 수 있습니다. 이 명령을 최적화를 하면 다음과 같이 할 수도 있습니다.
cat 을 이용하여 PIPE 를 통해서 넘기지 않고, "<" 키워드를 이용하여 stdin 으로 통하여 grep 으로 직접 넘겨주면 cat 을 한번 덜 실행해도 되므로 부하가 높은 시스템에서 기존 보다 훨씬 가볍게 동작이 가능 합니다.
그리고, if 문에서 사용하는 test 기호 "[" 는 실제 syntax 가 아니라 /bin/[ 명령 입니다. 그러므로 Bash 3부터 지원하는 "[[ ]]" syntax 를 사용하면 좀 더 가볍고 && || 연산 기호도 사용할 수 있습니다.
위의 3가지 표현은 같은 의미 입니다.
그리고 "[" 와 "[[" 문법의 가장 큰 차이중의 하나가 바로 -z "$B" 인데요.. "[" 를 이용한 테스트를 할 경우에는 -z 즉 $B 에 값이 없으면 -z 뒤에 인자가 없는 것으로 간주가 되어 에러가 발생합니다. 그러므로 꼭 변수 quoting을 꼭 주어야 하는데요. "[[" 의 경우는 syntax 이기 때문에 빈 변수를 quoting 해 주지 않아도 된다는 장점이 있습니다. bash2 와 같이 아주 오래된 legacy shell 을 사용하지 않는다면.. "[" 는 버리고 "[[" 를 습관하 해 주시는 것이 더 좋습니다.
상세하게 예외 처리 까지 감사합니다.
조언 해주신 대로 응용해서 해볼게요 감사합니다!
조언 정말 감사드립니다 ㅠㅠ!
조언 정말 감사드립니다 ㅠㅠ!
댓글 달기