>source

저는 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 그것으로 갈 if 그리고 사용 && ( "and") 대신 || ( "또는") 올바른 논리를 얻으려면 :

    if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
        echo 'Good afternoon'
    fi
    
    

    나는 표준을 사용하고있다 [ ... ] 대신 테스트 bash 쉘 자신의 [[ ... ]] 여기에서 테스트하여 $hour 해석된다 (에 의해 도입 된 산술 문맥에서 -ge-lt 테스트)를 유효하지 않은 8 진수 ( 0809 ).

    사용할 필요가 있다고 생각되면 [[ ... ]] 당신은 시험 할 수 있습니다 ${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이없는 현재 시간 (0-23)을 할당합니다.

  • 이전 linux - tty7의 터미널 뷰는 어디에 있습니까?
  • 다음 cp - 외부 장치로 복사하면 NixOS에서 특수 문자가 엉망이됩니다