저는 Gnu/Linux와 bash를 처음 접했고, 미리 정의된 시간 범위 내에 있는지 테스트하기 위해 간단한 bash 스크립트를 작성하려고 했지만 date +%H
성공하지 못했습니다.
예:
hour='date +%H'
if [[ $hour -ge 12 ]] || [[ $hour -lt 19 ]]
then echo "Good afternoon!"
이에 대해 행을 분리하려고 하면 "예상 정수 표현식"이 발생합니다.
test $hour -ge 12
$hour를 정수로 반환하거나 문자열로 처리하는 등 간단한 내용이 누락된 것 같습니다.
편집: 이것은 완성된 스크립트입니다. 기본 수준에서 필요한 개선 사항이 있습니까?
!#/bin/bash
name=$(whoami)
hour=$(date +%H)
if [ $hour -lt 5 ] || [ $hour -ge 19 ]
then xmessage -center "Good evening $name!"
elif [ $hour -ge 5 ] && [ $hour -lt 12 ]
then xmessage -center "Good morning $name!"
else xmessage -center "Good afternoon $name!"
fi
답변1
date +%H
변수에 리터럴 문자열을 할당하고 있습니다 hour
.
이 명령을 실행 date
하고 할당하십시오.산출, hour
명령 대체를 사용하십시오.
hour=$(date +%H)
또는 최근 출시된 bash
셸(4.2+)을 통해
printf -v hour '%(%H)T' -1
그것을 사용하지 않고도 같은 일을 할 것입니다 date
.
또한 올바른 논리를 얻으려면 fi
다음을 따르고 ( "or") 대신 ("and") if
를 사용해야 합니다 .&&
||
if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
echo 'Good afternoon'
fi
여기서는 값이 유효하지 않은 8진수(합계)로 해석되는 문제 (및 테스트에 의해 도입된 산술 컨텍스트에서)를 피하기 위해 쉘 자체 테스트 [ ... ]
가 아닌 표준 테스트를 사용하고 있습니다 .bash
[[ ... ]]
$hour
-ge
-lt
08
09
값을 사용해야 한다고 생각되면 문제를 피하기 위해 수정하지 않고 [[ ... ]]
테스트할 수 있습니다 . 의 값은 단일 선행 을 제거하는 것과 동일합니다 .${hour#0}
$hour
${hour#0}
$hour
0
if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then
echo 'Good afternoon'
fi
답변2
((...))
Bash는 산술 연산을 위한 구문 도 지원합니다 . 코드는 다음과 같이 다시 작성할 수 있습니다.
#!/bin/bash
declare -i hour=$(date +%k)
if (( hour > 12 && hour < 19 ))
then
printf "Good afternoon\n"
fi
이 줄은 declare -i hour=$(date +%k)
변수가 hour
산술 정수로 처리되고 현재 시간(0-23)이 앞에 0 없이 할당되도록 지정합니다.