Newsgroup: it.comp.os.linux.iniziare
Titolo: bash shell script - aumento progressivo

Ciao ,
all'inizio del mio script ho un numero progressivo composto da 7
cifre,
------------------------
#!/bin/bash
0000000
------------------------
vorrei che ad ogni esecuzione del mio script, il numero aumenti di 1
come posso fare ?
grazie


Non lo puoi fare.
Non sullo stesso file.
Adesso, perche' non spieghi il problema, invece della tua soluzione?
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net


A parte il fatto che un numero cosi` come l'hai messo non ha molto
senso (non lo puoi eseguire...). Dovresti avere il numero o in un
blocco oppure in una dichiarazione di variabile.
Uno script che modifichi se stesso non e` proprio una buona idea. Puoi
provare a fare in modo tale che il numero abbia sempre lo stesso
numero di caratteri, ma anche in questo caso potresti avere problemi.
Piu` safe sarebbe avere il numero in un secondo file, updatato dallo
script stesso.
Molto piu` pulito sarebbe avere il numero in una locazione esterna,
tipo database o file protetto.
In ogni caso, per la domanda originale, andando di grep, read,
aritmetica e printf/echo non dovrebbe essere un problema.
Ciao,
  -- Roberto

 Adesso, perche' non spieghi il problema, invece della tua soluzione? 
Esattamente :)
-- 
Vide


purtroppo non mi è possibile usare file esterni o scrivere su un db.
il numero a 7 cifre è obbligato perchè si tratta  di files che partono
dal n. 0000000
ed arriveranno periodicamente fino ad un n. xxxxxxx
grazie

 sed -i s/\#\ 000/\#\ 001/ prova.sh
Prova a cambiare 000 con 000000000000000000000000000000000000000001 e
dimmi che succede...
Ciao,
  -- Roberto

 
-- 



scusate ...
arriveranno appunto fino ad un numero. xxxxxxx
lo script deve essere schedulato ogni giorno e deve trasferire solo il
file con il n. progressivo corretto

 ed arriveranno periodicamente fino ad un n. xxxxxxx
E perche` te ne devi "ricordare" all'interno della script? Non
basterebbe andare a vedere che cosa hai gia` fatto e riprendere da
quel punto?
Dicci quale e` il tuo problema, non come vorresti risolverlo ;-)
Ciao,
-- Roberto

 Dicci quale e` il tuo problema, non come vorresti risolverlo ;-)
Alla fine, reinventa rsync, vedrai.



occhei :
ogni giorno mi arriva un file composto da
progressivo + nome
esempio 0000001_file.dat
lo script è schedulato appunto ogni giorno, deve prendere il file con
il progressivo corretto
e spedirlo via ftp .
durante una giornata pero' potrebbero arrivare piu' files ..
0000002_file.dat 0000003_file.dat 0000004_file.dat
lo script dovrà (ad ogni esecuzione) prendere solo un file per volta
(quello con il progressivo corretto) e spedirlo.
non so se è complesso ma come avrete capito sono alle prime armi :-)
grazie

 file con il n. progressivo corretto
Io scommetto che un 
ls /path/ai/tuoi/files -tr|tail -n 1
ti da esattamente lo stesso numero che vuoi salvare dentro lo script. Ci ho
preso?
-- 
Vide

 (quello con il progressivo corretto) e spedirlo.
Se in un giorno arrivano più file tu devi spedire solo il primo arrivato
oppure tutti?
Da come descrivi sembra il secondo caso, ma allora finiresti che non
spediresti mai tutti i file.
Se è il primo caso, come ha senso
find /path/to/files -maxdepth 1 -mtime 0 -daystart -type f
ti trova tutti i file di oggi che devi spedire
-- 
Vide


Questa e` quel fare io:
D=/nome/della/directory
S1="$D/.start"
S2="$D/.end"
touch "$S2"
find "$D" -newer "$S2" -a \! -newer "$S1" -print | while read f; do
ftp-di-$f; done
mv "$S2" "$S1"
Unico problema potenziale: se un file viene scritto mentre gira lo
script.
Come vedi, ho dovuto usare un file esterno (in effetti due, per
sicurezza). Creando due file vuoti che danno il timestamp di inizio e
fine del trasferimento precedente, puoi trovare il nome di tutti i
files creati nell'intervallo di tempo tra l'ultima esecuzione e
l'esecuzione corrente.
Ovviamente bisognere prima provare e vedere se funziona...
Ciao,
  -- Roberto

 Se è il primo caso, come ha senso
Scusate, invertire "secondo" con "primo", così:
Da come descrivi sembra il primo caso, ma allora finiresti che non
spediresti mai tutti i file.
Se è il secondo caso, come ha senso
-- 
Vide

 find "$D" -newer "$S2" -a \! -newer "$S1" -print | while read f; do
Dimenticavo... ci vuole una piccola protezione nel caso "$1" non
esista (la prima volta che fai girare lo script sulla directory data).
Ma questo te lo lascio come esercizio.
-- Roberto

Domanda stupida... I files gia` trasferiti li devi lasciare in loco?
Non potresti cancellarli oppure spostarli su una directory diversa?
Cosi` salveresti capra e cavoli ;-)
Ciao,
  -- Roberto


si il primo comando restituisce l'ultimo file arrivato !
il fatto è che in teoria dovrebbe arrivare un file per volta ,
ma mi hanno avvisato che potrebbe capitare anche di receverne piu' di
uno (è un errore e la cosa andrà gestita manualmente )
se uso "ls /path/ -tr|tail -n 1" in caso ci sia un file solo, sarebbe
perfetto.
ma se me ne mandano piu' di uno è un problema ...

 come posso fare ?
Vedo che il codice automodificante non e` piu' di moda.
Comunque sconsiglio di usarlo.
------
#! /bin/bash
# 00000
#
# Fare qualcosa
#
TMPFILE=$(mktemp -t script.XXXXXXXXXX) || exit 2
awk -- 'NR==2 {printf "# %05.5d\n", $2+1 }
        NR!=2 {print}'  $0 > $TMPFILE ||
           ( rm $TMPFILE
              exit 1 )
cp $TMPFILE $0
rm -f $TMPFILE
------
PS Lo so!

 ...
Qualcuno e` riuscito a scrivere del codice sed
per fare operazioni matematiche ma lo sconsiglio.
Se sei interessato a vedere come fare:
info sed

 uno (è un errore e la cosa andrà gestita manualmente )
Se ne arrivano più di uno, quale devi prendere? Rispondi alla domanda :P
-- 
Vide


solo quello che ha il progressivo piu' basso !
:)

 PS Lo so!
Ah, ecco.


 :)
Soluzione definitiva:
find /path/to/files -maxdepth 1 -mtime 0 -daystart -type f|sort|head -n 1
ti cerca tutti i file modificati in giornata, li ordina per nome crescente e
prende il primo (quello con progressivo più basso).
-- 
Vide

 
Da quello che ha detto prima, domani dovrebbe prendere il secondo
arrivato oggi.


 arrivato oggi.
Non credo, perchè ha detto che la situazione "ne arriva più di uno al
giorno" è un errore che non dovrebbe accadere, quindi la routine è "un file
al giorno". Che il file di domani abbia un numero o un altro non è
importante... almeno da quello che capisco io del problema.
Comunque a sto punto ha abbastanza indizi per risolverselo da solo il
problema :P
-- 
Vide


provato
direi che è perfetto !
grazie !
e grazie a tutti per l'interessamento !

 grazie !
La migliore maniera di ringraziarci ora è andarsi a leggere con calma i man
di tutti i comandi involti nell'operazione ;)
-- 
Vide


senz'altro !
:-)