In bash, come potrei aggiungere interi con zeri e di mantenere un buffer specificato
-
02-10-2019 - |
Domanda
Per esempio, voglio contare da 001 a 100. Si intende la memoria zero sarebbe iniziare con 2, 1, poi alla fine 0 quando raggiunge 100 o più.
es: 001 002 ... 010 011 ... 098 099 100
ho potuto fare questo se i numeri avevano un numero predefinito di zeri con printf "% 02d" $ i. Ma questo è statica e non dinamica e non avrebbe funzionato nel mio esempio.
Soluzione
Se per statica rispetto dinamica vuol dire che ti piacerebbe essere in grado di utilizzare una variabile per la larghezza, si può fare questo:
$ padtowidth=3
$ for i in 0 {8..11} {98..101}; do printf "%0*d\n" $padtowidth $i; done
000
008
009
010
011
098
099
100
101
L'asterisco viene sostituito dal valore della variabile corrisponde nella lista degli argomenti ($padtowidth
in questo caso).
In caso contrario, l'unica ragione per cui il tuo esempio non funziona è che si utilizza "2" (forse come se fosse l'imbottitura massima da applicare) quando dovrebbe essere "3" (come nel mio esempio) dal momento che il valore è la larghezza totale risultante (non il pad sola larghezza).
Altri suggerimenti
Se il sistema ha, provate seq
con il -w
(--equal-width
) l'opzione:
$ seq -s, -w 1 10
01,02,03,04,05,06,07,08,09,10
$ for i in `seq -w 95 105` ; do echo -n " $i" ; done
095 096 097 098 099 100 101 102 103 104 105
In Bash versione 4 (uso bash -version) è possibile utilizzare espansione delle graffe . Mettere un 0
prima né forze limite i numeri da riempito da zeri
echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
#!/bin/bash
max=100;
for ((i=1;i<=$max;i++)); do
printf "%0*d\n" ${#max} $i
done
Il codice qui sopra auto-pad i numeri con il numero corretto di 0 sulla base di quante cifre del valore massimo / terminale contiene. Tutto quello che dovete fare è cambiare la variabile max
e si occuperà del resto.
Esempi:
max = 10
01
02
03
04
05
06
07
08
09
10
max = 100
001
002
003
004
005
006
...
097
098
099
100
max = 1000
0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000
# jot is available on FreeBSD, Mac OS X, ...
jot -s " " -w '%03d' 5
jot -s " " -w '%03d' 10
jot -s " " -w '%03d' 50
jot -s " " -w '%03d' 100
Se avete bisogno di pad valori fino ad un numero variabile con imbottitura variabile:
$values_count=514;
$padding_width=5;
for i in 0 `seq 1 $(($values_count - 1))`; do printf "%0*d\n" $padding_width $i; done;
Questo sarebbe stampare 00000, 00001, 00513 .... (Non ho trovato nessuna delle risposte attuali soddisfare il mio bisogno)