Um comando que aceita um único argumento numérico e imprime o dia da semana com base na fórmula

1
days=('Sunday''Monday')
days=('Tuesday''Wednesday')
days=('Thursday''Friday')
days=('Saturday')

for numbers in "S@";

do
        if [ $numbers -ge 0 ];
        then
                result=$(($numbers % 7))
                echo ${days[$result]}
        fi
shift
done

Isso é o que eu tenho até agora, mas sou muito novo na coisa toda e recebo erros.

    
por Jack22 15.12.2015 / 23:06

1 resposta

3

Você está tendo problemas para declarar sua matriz:

days=('Sunday''Monday')          # this means days[0]="SundayMonday"
days=('Tuesday''Wednesday')      # this means days[0]="TuesdayWednesday"
days=('Thursday''Friday')        # this means days[0]="ThursdayFriday"
days=('Saturday')                # this means days[0]="Saturday"

Você quer isso:

days=(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

Você pode citar os nomes dos dias, se quiser, pois o shell não se importa, já que não há expansões de shell que possam ocorrer neles.

Próximo

for numbers in "S@";

Isso é uma letra maiúscula S , e não o sinal de dólar necessário $ . então, a primeira e única vez através do loop, o valor de $numbers será a string de 2 caracteres S@

Além disso, parece OK.

Pequenas coisas delicadas:

  • você não precisa terminar as linhas com ponto e vírgula
  • "números" é um nome de variável inválido para conter apenas um número
  • o bash expande variáveis sem o sigilo em expressões aritméticas:

    result=$((numbers % 7))
    echo "${days[result]}"
    
  • se você está interagindo com os parâmetros posicionais, não precisa se referir a eles:

    for number do echo "${days[number % 7]}"; done
    

Eu escreveria isso como uma função de shell:

day_of_week() {
    local dow=$1
    if [[ $dow -lt 0 ]]; then 
        echo "error: pass a positive number"
        return 1
    fi
    local days=(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
    echo "${days[dow]}"
}
    
por 15.12.2015 / 23:42