인프런 커뮤니티 질문&답변

송현준님의 프로필 이미지
송현준

작성한 질문수

시스템엔지니어가 알려주는 리눅스 기초편 Bash Shell Script

간단 쉘 스크립트(1) 조건문 if

문자열 비교 관련 질문드립니다.

작성

·

432

0

수업 내용중에 CPU Load Average 스크립트 작성 간단하게 보여주시길래 직접 작성해보았습니다.
근데 if 조건문에서 -ge 로는 제가 정의한 LOAD 변수가 문자열이라서 오류가 나더라고요.
"integer expression expected"
---------------------------------------------------------
$ vi loadaverage.sh
#!/bin/bash
  
LOAD=$(uptime|awk '{print $10}')
 
if [ "${LOAD}" > 0 ]; then
      echo "CPU load5 average is too high"-
else
      echo "No problem"
fi
-----------------------------------------------------------
위와 같이 작성하니까 정상 작동 합니다. 다만 문자열은 "크거나 같음" 비교는 없는지 궁금하네요.
또는 파이썬에서 int를 사용하여 문자를 정수형으로 변경하는 방식처럼 shell script에서도 문자를 정수형으로 변환 가능한지 궁금합니다.
구글링 해봤는데 제가 잘 못찾는건지.. 강사님께서 알려주신 비교 방법 이외에 다른거는 잘 안나오더라고요.
 
- 추가 작성 -

하다보니까 문자열 비교는 바이트 비교라서 제가 작성한것도 틀렸네요.. 아무튼 답변 기다리겠습니다.

답변 3

0

그로스쿨님의 프로필 이미지
그로스쿨
지식공유자

안녕하세요 현준님:)

로드에버리지를 확인하고 무언가 작업을 하는 경우는 흔히 있는 케이스입니다. 
uptime에서 awk로 잘라서 가져오게되면 ,가 포함되기 때문에 한 번 더 처리를 해 줘야 합니다. 
작성하신 코드대로 LOAD=$(uptime|awk '{print $10}') 이렇게 가져올 경우, echo "${LOAD}"로 LOAD에 들어간 값을 살펴보면 0.00, 이렇게 콤마를 포함한 값이 들어갑니다. 
원하는 결과가 안나온 이유는 콤마가 들어간 값과 숫자를 비교하려고 했기 때문입니다. 

uptime|awk '{print $10}'|awk -F, '{print $1}' 로 콤마를 제외한 값을 가져오거나 
awk '{print $1}' /proc/loadavg 로 5분평균 값을 바로 가져오는 방법도 있습니다. 

참고로 로드에버리지는 실수범위를 가지고 있고 bash에서는 정수형을 비교하기 때문에 integer expression expected 라는 에러가 발생할 수 있는데 
두 가지 패턴으로 해결할 수 있습니다. 
1. 정수값만 가져와서 비교
 --> LOAD=$(awk '{print $1}' /proc/loadavg|bc)
2. bc를 사용하여 소수점 아래를 버린 후 정수타입으로 비교
 --> LOAD=$(awk -F. '{print $1}' /proc/loadavg)

어느쪽을 사용하셔도 결과는 같습니다. 

0

송현준님의 프로필 이미지
송현준
질문자

답변 감사드립니다. 그럼 LOAD를 변수로 선언할 때 CPU load5 average를 uptime 명령어에서 가져오면 문자열로 가져오게 되는데 숫자로 가져오는 방법은 없을까요?

CPU load5 average가 특정 값보다 크거나 같은 경우 특정 명령어를 실행하도록 해보고 싶은데 방법이 없나 궁금합니다.

0

그로스쿨님의 프로필 이미지
그로스쿨
지식공유자

파이썬을 다룰 줄 아는 분이신가봐요.

 

 배시쉘은 변수를 타입으로 구분하지 않기 때문에 타입변환도 하지 않습니다. 

 그렇기 때문에 숫자 이외에는 전부 문자열로 인식한다고 생각하시면 될 것 같습니다. 

 

 그리고 문자열에서는 크거나같음을 사용하지 않는 것으로 알고 있습니다. 

 같다(=), 다르다(!=), 왼쪽의아스키값이작다(<), 왼쪽의아스키값이크다(>) 등으로 판별합니다.

송현준님의 프로필 이미지
송현준

작성한 질문수

질문하기