if 문에 정수 표현식이 필요합니다.

if 문에 정수 표현식이 필요합니다.

Mac이 24시간 이상 실행된 경우 Mac을 종료하는 작은 종료 스크립트가 있습니다. 나는 Bash 스크립팅에 대한 실제 경험이 없지만 다음을 수행했습니다.

!/bin/bash

#Maximum number of days to be up
max=1

#Get the uptime days and assign it to a variable
uptime_days=`uptime | cut -d " " -f 5`

if [ $uptime_days -ge $max ]
  then 
  shutdown -h now
fi

exit 0

이제 다음 오류 메시지가 나타납니다.

./shutdown: line 9: (: days,: integer expression expected

누구든지 도와줄 수 있나요?

답변1

이는 macOS에서 작동합니다. 출시 타임스탬프를 얻은 다음 초 단위의 현재 타임스탬프를 얻은 다음 몇 가지 계산 결과를 얻었습니다.

#!/bin/bash
BOOT_TIME=$(sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/')
CURR_TIME=$(date +%s)
MAX_UPDAYS=1 #Days

DAYS_UP=$(( ( $CURR_TIME - $BOOT_TIME) / 86400 ))
if [ $DAYS_UP -ge ${MAX_UPDAYS} ];then
   shutdown -h now
fi

답변2

스크립트의 주요 오류는 cut다음과 같습니다.

uptime_days=`uptime | cut -d " " -f 4`

5로 변경된다는 점에 유의하세요 4. 이는 컷이 days앞에 있는 숫자가 아닌 단어를 선택하기 때문입니다.

echo이러한 오류를 잡는 방법은 코드에 다음을 추가하는 것입니다.

echo uptime_days=$uptime_days

따라서 출력에 다음이 포함되면

uptime_days=days,

분명히 구문 분석 중에 일부 오류가 발생했습니다.

향후 문제를 방지하기 위해 개선할 수 있는 몇 가지 다른 사항이 있습니다.

셰르본

#!커널이 읽을 수 있도록 스크립트의 첫 번째 줄은 로 시작해야 합니다 . 어쨌든 코드는 셸에 의해 해석되지만 명령을 다르게 실행하면 맨 위 줄이 다음과 같이 표시되지 않을 수 있습니다.

#!/bin/bash

좋은 생각이에요.

이중 괄호

셸에서 조건문에 이중 대괄호를 사용하면 오류가 발생할 가능성이 줄어듭니다. 다음과 then같이 같은 줄로 이동할 수도 있습니다 if.

if [[ $uptime_days -ge $max ]]; then 
     echo shutdown!
fi

답변3

전체 스크립트는 다음과 같습니다.

#!/bin/bash
uptime | grep -q days && shutdown -h now

관련 정보