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.