O primeiro problema é que você está perguntando sobre um problema diferente daquele que você está tendo ...
Para começar com uma resposta muito literal: Se você deseja acessar uma variável cujo nome está em outra variável, é possível usar "expansão indireta" - o operador ${!...}
. Por exemplo:
var=yr$i; ystart=${!var}
var=mo$i; mostart=${!var}
...
No entanto, o que você está fazendo ao anexar um número de índice a nomes de variáveis é apenas emular ineficientemente uma variável de matriz , mesmo que o bash já tenha arrays como um tipo de dados interno:
yr=() # declare 'yr' to be an empty array
mo=()
yr[1]=2008
mo[1]=11
yr[2]=2009
mo[2]=01
for (( i=1; i <= nruns; i++ )); do
echo "Date: ${yr[i]}-${mo[i]}-${day[i]}"
done
(Você também pode iterar em todas as 'chaves' usando for i in ${!yr[@]}
.)
Finalmente, apenas para responder ao último exemplo: Se você quiser zerar os números dos pads, você pode usar o comando printf
com strings de formato similares àquelas em C:
yr=2009
mo=4
day=7
hr=11
min=5
printf "%d-%02d-%02d %02d:%02d\n" $yr $mo $day $hr $min
# -> 2009-04-07 11:05
Aqui %d
significa um número decimal (a distinção entre %d
e %s
é importante em C, mas eles são quase intercambiáveis no bash). %2d
terá pelo menos 2 caracteres de comprimento e alinhamento à direita (use largura negativa para alinhar à esquerda); %02d
torna zero preenchido em vez de preenchido com espaço.
printf "[%d] [%-4d] [%03d]\n" 1 2 3 # -> [1] [2 ] [003]