inflearn logo
강의

Khóa học

Chia sẻ kiến thức

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

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

616

thdguswns12164184

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

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

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

linux shell-script

Câu trả lời 3

0

groschool

안녕하세요 현준님:)

로드에버리지를 확인하고 무언가 작업을 하는 경우는 흔히 있는 케이스입니다. 
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

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

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

0

groschool

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

 

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

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

 

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

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

강의 듣는 타겟층

0

72

2

기초편 교안 실행 안될 경우 참고사항.

2

385

1

AND에서 조건 둘이 참이어야 실행한다는 부분이 이해가 되지 않아 질문 드립니다.

0

375

1

강의 자료 제공 가능할까요?

0

463

1

codeonweb 관련 질문

0

516

2

Ubuntu / Network Interface SysConfig 파일 찾는 법

0

1319

1

Ubuntu / Bareword "test0" not allowed while "strict subs" / 해결법

0

1067

1

실습환경에 대한 문의 드립니다.

0

564

2

강의를 초반을 듣는중에 궁금한점이 있어 문의드립니다.

0

370

1

bash와 zsh은 어느 정도의 차이가 나나요?

0

2987

1

웹 리눅스 환경으로만 진행해야 하나요?

0

406

1

방화벽에 대해서 질문드립니다.

0

337

1

mount에 대해서 질문드립니다.

0

380

1

쉘 스크립트 안에서

0

384

1

쉘 스크립트 작성해보았습니다

2

776

1

별도의 강의 자료는 없는것인지 문의 드립니다.

0

301

1

분명 파일이 있는데 계속 -bash: cd: /root/SHELL: No such file or directory 라고 뜹니다

0

2897

1

저는 이렇게 작성했습니다. 멘트 부탁드려요

0

272

1

강의듣다보니..

0

278

1

/dev/null 에 관해서 질문이요

0

787

1

menu.sh 내 menu 함수 작성 시 중괄호

0

281

1

sed 명령어 옵션 질문

0

509

2

function menu 함수 GUI로 작성 시 에러?상태

0

311

1

한글입력

0

225

1