Newsgroup: it.comp.os.linux.iniziare
Titolo: leggere da un txt il valore di una variabile

Da terminale:
gedit directory/file.txt
X=directory/file; gedit $X.txt
In entrambi i casi mi mostra il file richiesto. Se metto entrambe le righe
in uno script bash ed lo eseguo, di nuovo in entrambi i casi mi mostra il
file richiesto. Se invece metto entrambe le righe in un file di testo, e
poi creo uno script bash che legge una riga di questo file di testo (read
LINE) e la esegue ($LINE), la prima riga funziona e la seconda no. Il
messaggio di errore e' X=directory/file;: Nessun file o directory.
Immagino che il problema sia quello di come leggere da un file di testo un
valore da assegnare ad una variabile all'interno di uno script bash.
C'e' modo di farlo funzionare anche in questo modo?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 C'e' modo di farlo funzionare anche in questo modo?
Probabilmente manca solo proteggere con il doppio apice la variabile,
ma vedere come � il tuo script potrebbe aiutare. ;-)
Questo, ad esempio, funziona:
while read riga
do
   echo "$riga"
done <letto
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net

 messaggio di errore e' X=directory/file;: Nessun file o directory.
Usa source, anziché read LINE.
file1:
gedit directory/file.txt
X=directory/file; gedit $X.txt
file2:
#!/bin/bash
source file1
e ovviamente non ti scordare di dare:
chmod 0755 file2.
se ho capito cosa volevi fare.
-- 
Massimo Bacilieri AKA Crononauta

 C'e' modo di farlo funzionare anche in questo modo?
Avevo fatto uno script di prova che forse ti puo` essere utile:
#!/bin/bash
## "readline.sh" 
## Legge le righe contenute nel file 'lista.txt'.
## N.B.: per terminare la lettura, nell'ultima riga del file
## 'lista.txt' occorre ci sia scritto 'quit' (senza apici).
COUNTER="1" # Imposta il contatore righe a 1.
while [ 1 ] # Ciclo infinito.
do
echo
echo "Elenco delle righe contenute nel file 'lista.txt':"
echo
cat lista.txt
echo
# Legge in lista.txt la riga numero ${COUNTER} :
riga=$(sed -n "${COUNTER}p" lista.txt)
if [ "$riga" = "quit" ] || [ "$riga" = "" ]; then
break # Esce dal ciclo.
else
echo "-------------------------------------------"
echo "Riga numero $COUNTER del file 'lista.txt' :"
echo "$riga"
echo "-------------------------------------------"
# Attende 15 secondi per permettere di aggiungere o
# togliere righe al file 'lista.txt' durante l'esecuzione.
sleep 15
# Incrementa il contatore righe:
let COUNTER=COUNTER+1
fi
done
echo
echo "Premere il tasto [Invio] per chiudere."
read dummy

 Usa source, anziché read LINE.
Forse e' meglio che spiego da principio quello che devo fare. Devo
lanciare una serie di run in modo automatico (run01, run02, ecc) ma devo
anche poter inserire nuovi run se si presenta la necessita'. Ad esempio,
mentre sta girando il run01, devo poter inserire nella coda il run01bis,
da far girare prima di run02. A questo scopo ho creato due file:
000_runs_done, inizialmente vuoto
000_runs_waiting, che contiene inizialmente (i parametri -x, -y, ecc non
sono importanti per la discussione):
esegui -x directory01/run01.xxx -y directory01/run01.yyy ecc. 
esegui -x directory02/run02.xxx -y directory02/run02.yyy ecc. 
ecc.
e poi ho creato in qualche ora di lavoro il seguente bash script, il primo
della mia vita:
#!/bin/bash
FILE1=./000_runs_waiting.txt # run in attesa, nell'ordine in cui saranno
processati
FILE2=./000_runs_done.txt # run completati, quelli piu' recenti in coda
while true; do
  exec 10<> $FILE1 # open file run in attesa
  read LINE <&10 #legge la riga da fare eseguire
  if [ -z "$LINE" ]; then # termina se la riga e' vuota
    sleep 10 # per avere il tempo di leggere il messaggio di errore, se
presente
    exit
  fi
  $LINE # esegue la riga (non vuota)
  exec 10>&- # close file run in attesa
  echo $LINE >> $FILE2 # appende (>>) la linea eseguita in coda ai run
completati
  sed -i -e "1d" $FILE1 # elimina la prima riga dei file in attesa
done
Lo script funziona perfettamente fintantoche' uso per righe quelle dette
prima, ossia:
esegui -x directory01/run01.xxx -y directory01/run01.yyy ecc. 
Io pero' vorrei abbreviare questo path, che e' contenuto tante volte, in
questo modo:
X=directory01/run01; esegui -x $X.xxx -y $X.yyy ecc. 
Pero' la cosa non funziona. La mia frustrazione nasce dal fatto che questa
stessa riga funziona perfettamente se data in una shell bash, ma non
funziona all'interno dello script. Nemmeno proteggere con doppio apice,
come suggerito da Roberto ("$LINE" # esegue la riga non vuota) funziona.


 come suggerito da Roberto ("$LINE" # esegue la riga non vuota) funziona.
Ma hai letto il mio post?
Se nella lista incolonni tutta una serie di nomi di file eseguibili e poi 
nello script anziche` leggere una riga dopo l'altra con echo "Sriga", gliele 
fai eseguire con source $riga, non risolvi?
Mentre esegue una riga, poi riaprire il file lista.txt e modificarlo, 
aggiungendo righe che verranno lette ed eseguite nei cicli successivi.

 fai eseguire con source $riga, non risolvi?
No, non risolvo. Se nel file che contiene la lista ho:
esegui -x directory01/run01.xxx -y directory01/run01.yyy ecc.
allora va tutto bene. Ma se nella lista ho: 
X=directory01/run01; esegui -x $X.xxx -y $Y.yyy ecc.
allora ottengo il messaggio di errore:
X=directory01/run01;: Nessun file o directory


 X=directory01/run01;: Nessun file o directory
Prova
eval $riga
e tanti in bocca al lupo.
-- 
Cio' che si vede, e'.

 eval $riga
Cosi' funzionaaaaaaa! :)
Grazie a te e a tutti.
