O problema no exemplo específico que você mostra não é que m
tenha um zero à esquerda - mesmo que tenha sido tratado como octal, 02
ainda é apenas 2
. O teste que você está usando é:
[ $((m-1)) -gt 1 ]
Mas m-1 > 1
é equivalente a m > 2
. Como 2
não é maior que 2
, a cláusula else
será executada. Você pode alterar o teste para simplesmente
[ $m -gt 1 ]
Mas seria muito mais simples usar diretamente os recursos aritméticos do shell:
m=02
y=2017
p_m=$(( (m+10)%12 + 1 ))
p_m_y=$(( y - (m==1) ))
Esse último bit provavelmente merece alguma explicação:
Para p_m
, usamos aritmética modular. (m + 10)%12
é equivalente a "dois meses antes (ou dez meses depois), exceto que dezembro é listado como 0". Em seguida, adicionamos um para alcançar "o mês anterior, no intervalo de 1 a 12".
A última linha é mais simples. (m==1)
é 1
se m
for numericamente igual a 1, senão 0
. Portanto, p_m_y
é definido para o ano atual se m
não for 1, senão no ano anterior.
Como um aparte, você diz:
m is originally derived from the date command and so has a leading zero if current month < 10.
Este não é necessariamente o caso. No meu sistema:
$ date
2017年 5月 9日 火曜日 13:58:53 EDT
$ LC_ALL=en_US.UTF-8 date
Tue May 9 13:58:53 EDT 2017
$ date '+%Y %m %d' | sed 's/ 0*/ /g'
2017 5 9
Então, se você está preocupado com números sendo interpretados como octal, você pode querer tentar este último.