Temos um script ksh que supostamente fornece a saída no último dia do mês, mas sempre que o executamos, obtemos o erro abaixo:
cut: fields are numbered from 1
Try ‘cut —help’ for more information,
Tenho tentado depurar isso, mas não consigo.
Aqui está o código:
#!/usr/bin/ksh
if (( $(#) <= 1 )) ; then print "${0##*/} <two-digit month> <four-digit year›" ; exit 101 ; fi
typeset -Z2 month=${1}
typeset -Z4 year=${2}
typeset -i whencecal=$(whence cal 2>/dev/null | wc - l)
if (( whencecal != 1 )) ; then print "FATAL: \"cal\" command not found!" ; exit 102 ; fi
typeset -i wrdcount=$(cal ${month} ${year} | sed -e "/^$/ d" | tail -1 | wc -w)
typeset -Z2 momaxdate=$(cal ${month} ${year} | sed -e “/^$/ d” -e “s/[ ][ ]*/,/g” | tail -1 | cut -d”,” -f${wrdcount})
print ${momaxdate}
O que pode ser feito para corrigir isso
cut: fields and positions are numbered from 1
é o que a versão GNU coreutilscut
reclama se você fornecer um número de campo zero. Os campos são numerados a partir de 1, portanto zero é inválido. (Se você desse algo que não fosse um número, ocorreria um erro diferente.)Agora, você sabe que
wrdcount
termina em zero, então vamos dar uma olhada mais de perto na saída decal
.Ou com
od
:Essa última linha não está vazia, mas contém 22 espaços. O que significa que
/^$/
não corresponde, por isso não é removido. Você precisaria de algo como/^ *$/
, ou melhor,/^[[:space:]]*$/
em vez disso.Agora, tudo isso parece uma forma um tanto complicada de obter o último dia do mês. Você poderia fazer isso com o awk de maneira um pouco mais simples:
(
NF
fornece o número de campos na linha,$n
é o campo n , assim como$NF
o último campo eNF > 0
testa se a linha tem algum conteúdo, ou seja, não está vazia ou apenas com espaço em branco.)Ou, como mostrado nos comentários, com a versão GNU coreutils de date:
(Isso funciona porque avançar um mês mantém o número do dia igual, então vai para o primeiro dia do mês seguinte, de onde podemos voltar para o último dia do mês de interesse.)