[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: problema bash passaggio parametri 2



Il 11 agosto 2010 17:10, xserver80 <xserver80@gmail.com> ha scritto:
> Buon giorno a tutta la lista.
>
> Ripropongo il problema di qualche settimana fa (oggetto precedente
> "problema bash passaggio parametri").
>
>
> Il problema fondamentalmente rimane lo stesso, ovvero non riesco a
> passare correttamente dei parametri da uno script ad un'altro.
>
> Lo script main.sh legge tramite un ciclo da un file di testo [ while
> read line; do; ....; ... ; done < file.txt ], e internamente cerca di
> passare $line ad un altro script [ ./montaggio.sh $line ].
> All'interno di file.txt metto, per riga, una serie di valori, con
> spazi, tra virgole doppie. [ "var1" "var due" "var 3" var4" ]
>
> Il punto è che se provo a dare in pasto a montaggio.sh le variabili da
> riga di comando, come da riga di file.txt, funziona tutto
> correttamente e mi prende le variabili ( se chiamo da shell
> ./montaggio.sh "var1" "var due" "var 3" var4" li riesco a prendere
> correttamente con $1, $2, etc...) , con gli spazi. Se invece cerco di
> fare la stessa operazione dal main.sh, dando ./montaggio.sh $line ,
> quando montaggio.sh mi prende le variabili se ne frega degli apici e
> li separa agli spazi.
> Ulteriore problema è che l'ultima variabile sarà una password, e
> quindi potrà contenere caratteri particolari. Avrei risolto con un
> "shift;shift;shift; var4=$*".
>
>
> Tutto il problema l'ho in realtà risolto al momento andando a prendere
> le variabili una a una dal main.sh, con awk, e ripassandole
> singolarmente.
>
>
> Avete qualche idea del perchè bash abbia questo comportamento? Sbaglio
> qualcosa io?O_o
>

Il comportamento è corretto, in quanto nel passaggio di $line allo
script subordinato, le virgolette doppie, che tu intendi come
delimitatori dei parametri, non assumono nessun significato
particolare.
Un modo per ovviare è utilizzare "eval", come nel seguente esempio
minimale, in cui lo script subordinato mostra i parametri ricevuti uno
per uno:

----------------------------------------------------------------------------------
#!/bin/bash
# file script1

app="${0##*/}"
echo "$app: le parentesi angolari non fanno parte delle righe di input lette."

while read line; do
  echo "$app: linea letta: <$line>"
  echo "$app: invoco script2"
  eval ./script2 "$line"
done <file.txt
----------------------------------------------------------------------------------

----------------------------------------------------------------------------------
#!/bin/bash
# file script2

app="${0##*/}"
echo "$app: le parentesi angolari non fanno parte di parametri"

i=0
for f; do
  echo "$app: Parametro n.$((++i)): <$f>"
done
----------------------------------------------------------------------------------

ciao

--
enzotib


Reply to: