강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của thdguswns12164184
thdguswns12164184

câu hỏi đã được viết

Kỹ sư hệ thống hướng dẫn Linux cơ bản Bash Shell Script

Script shell đơn giản (1) câu lệnh điều kiện if

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

Viết

·

607

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에서도 문자를 정수형으로 변환 가능한지 궁금합니다.
구글링 해봤는데 제가 잘 못찾는건지.. 강사님께서 알려주신 비교 방법 이외에 다른거는 잘 안나오더라고요.
 
- 추가 작성 -

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

linuxshell-script

Câu trả lời 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

thdguswns12164184님의 프로필 이미지
thdguswns12164184
Người đặt câu hỏi

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

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

0

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

 

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

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

 

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

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

Hình ảnh hồ sơ của thdguswns12164184
thdguswns12164184

câu hỏi đã được viết

Đặt câu hỏi