bash script com a instrução case não retornando uma saída

3

Eu escrevi este código para ecoar uma saudação dependendo de qual hora do dia é, mas quando eu o executo, ele não mostra nenhum erro, mas também não ecoa nada na linha de comando. Para tentar resolver o problema, eu comentei tudo e ecoei apenas a variável time, que funcionou bem. Então, o que estou fazendo de errado?!

#!/bin/bash


time=$(date +%H)

case $time in
#check if its morning
    [0-11] ) echo "greeting 1";;

#check if its afternoon
    [12-17] ) echo "greeting 2";;

#check if its evening
    [18-23] ) echo "greeting 3"
esac
    
por user193369 04.10.2016 / 19:49

3 respostas

6

[...] introduz uma classe de caracteres, não um intervalo inteiro. Portanto, [18-23] é idêntico a [138-2] , que é o mesmo que [13] , já que não há nada entre 8 e 2.

Você pode usar o seguinte como uma correção:

case $time in
#check if its morning
    0?|1[01] ) echo "greeting 1";;

#check if its afternoon
    1[2-7] ) echo "greeting 2";;

#check if its evening
    1[89]|2? ) echo "greeting 3"
esac
    
por 04.10.2016 / 19:52
2

Eu usaria avaliação aritmética bash em vez de correspondência de padrões.

hour=$(date +%_H)
if   ((  0 <= hour && hour <= 11 )); then echo 1
elif (( 12 <= hour && hour <= 17 )); then echo 2
else echo 3
fi

A única coisa que você deve ter cuidado é quando a hora é "08" ou "09" - esses são números octal inválidos. Então você tem que ter date para dar a você a hora sem um zero à esquerda. Daí o formato %_H

    
por 04.10.2016 / 20:19
0

[] não usa intervalos numéricos, ele usa intervalos de caracteres. O que você tem aí é algo que corresponde ao caractere "0" ou "1", os caracteres "1" e "7" e os caracteres "1" e "3". (bash ignora completamente os intervalos malformados 2-1 e 8-2. Eles são mal formados porque não estão aumentando.) Você também precisa de um% final;; e um *) seria preferível para capturar erros lógicos como este . Eu recomendo que você use uma cascata de declarações if para isso:

if [ "$time" -ge 0 ] && [ "$time" -le 11 ]; then
    echo Greeting 1
elif [ "$time" -ge 12 ] && [ "$time" -le 17]; then ...
    
por 04.10.2016 / 20:04

Tags