Newsgroup: it.comp.os.linux.iniziare
Titolo: here document e indentazione

Ecco il seguente bash script:
___________
#!/bin/bash
PROVA="prova despansione"
if [ "$1" = "print" ]
then
  sed 's/^[ ]\{2\}//' <<EOF
  This is my here document
  on more lines.
  la variabile PROVA di seguito:
     ${PROVA}
  It' also indented with
  the rest of the script!
EOF
else
echo 'add "print" as first argument!'
fi
_____________________________________
L'indentazione è fatta con degli spazi, quindi niente
tab. Il delimiter scelto è EOF.
Questo consente l'espansione della variabile $PROVA.
Tuttavia occorre mettere EOF finale collocato all'inizo
della riga. Cioè non è possibile indentarlo nel resto
dello script.
Volendo si può sì indentarlo di due spazi per esempio
con
blabla
  comando <<\ \ EOF
  here
  $VARIABILE
  document
  EOF
blabla
Il problema è che così la $VARIABILE non viene espansa.
Dal manuale (man bash --> here document) non capisco
perchè.
L'obiettivo è avere:
1. Testo dello script indentato con spazi e non con tab.
2. Here document e delimeter regolarmente indentati con
   il resto dello script.
3. espansione delle variabili dentro l'here document.

 3. espansione delle variabili dentro l'here document.
#!/bin/bash
NAME="John Doe"
RESPONDENT="the author of this fine script"
cat <<Endofmessage
Hello, there, ${NAME}.
Greetings to you, ${NAME}, from ${RESPONDENT}.
Endofmessage
Hello, there, John Doe.                                                                                                                                      
Greetings to you, John Doe, from the author of this fine script.
L'espansione funziona, forse č il tipo di uso (sed, command line, ecc.) che 
da problemi, prova spezzare lo script e a procedere per gradi.
AL limite puoi utilizzare un file temporaneo dove scrivere i comandi da 
lanciare.

 lo script e a procedere per gradi.
Non c'entra quello. Come l'hai usato tu funziona anche
a me, ma ti sei lasciato per strada i primi due punti
delle condizioni che vorrei realizzare.
Il sed al posto del cat serve solo per eliminare
l'indentazione dell'here document. In tal modo si può
eliminare lindentazione anche s e questa è costituita
da spazi piuttosto che da TABS.
Il problema si riduce ad utilizzare un delimiter
indentato col resto del codice, che nel mio caso
significa avere un delimiter del tipo
<SPAZIO><SPAZIO>EOF
Considera il tuo esempio modificato:
___________
#!/bin/bash
NAME="John Doe"
RESPONDENT="the author of this fine script"
# inizio indentazione a DUE SPAZI
  cat <<Endofmessage
  Hello, there, ${NAME}.
  Greetings to you, ${NAME}, from ${RESPONDENT}.
Endofmessage
______________
Ora si vuole trovare un delimiter opportuno in modo che
rispetti l'indentazione e l'espansione delle varibili.
L'esempio sopra avrebbe anche il problema di venire
scritto ad output scostato di due spazi "verso destra",
come ho già detto quel problema si può risolvere
facilmente sostituendo:    sed 's/^[ ]\{2\}//'
al comando:                cat
Da come hai risposto ho l'impressione che tu non abbia
letto bene il mio messaggio. Eventualmente ridacci
un'occhiata.
Il problema sta essenzialmente nel "quoting":
- se il delimiter contiene parti quotate allora
  l'espansione delle variabili nell'here document non
  avviene.
- per quoting s'intende anche il carattere "\" che io
  avevo usato per inserire i due spazi iniziali nel
  delimiter.
- il delimiter DEVE contenre 2 spazi iniziali perchè in
  quel modo risulta indentato.
  del tipo:
================
  cat << \ \ EOF
  $VAR
  EOF
================
  funziona come impaginazione, ma le variabili non
  vengono espanse.
- La domanda diventa come usare un delimiter del tipo
  <SPAZIO><SPAZIO>EOF
  senza utilizzare caratteri di quoting.

   senza utilizzare caratteri di quoting.
Secondo me non si puo' fare. Il man e' abbastanza esplicito:
If any characters in word are quoted, the delimiter is the result of quote 
removal on word, and the lines in the here-document are not expanded.
E non saprei come fare per mettere degli spazi senza usare quoting, visto 
che devono essere letterali.
Il meglio che puoi fare e' usare <<- e indentare con tab:
if [ 1 -eq 1 ]; then
  var=hello
  cat<<-EOF
        variable is $var
        EOF
fi
(le linee 4 e 5 sono indentate con tab)
--  
Cio' che si vede, e'.

 Non c'entra quello. Come l'hai usato tu funziona anche
]zac[
Non posso che ribadire:
Probabilmente è il tipo di uso, forse usando un file temporaneo dove 
scrivere i comandi, spezzare le varie operazioni (in maniera da poter 
impostare i parametri di esecuzione specifici per ogni azione) ...
Di nuovo aggiungo che via www.google si trovano un sacco di spunti, magari 
qualcuno utile.

 (le linee 4 e 5 sono indentate con tab)
Preferisco mantentre l'indentazione a spazi, opterò per
qualcosa del genere rinunciando all'indentazione.
if [ 1 -eq 1 ]; then
  var=hello
  sed 's/^[ ]\{2\}//'<<.
  variable is $var
.
fi
Oppure qualcosa del genere, che sposti la bruttuta in
una funzione relegata e non intacchi il corpo
principale del codice.
heredoc_test ()
{
  cat <<.
  variabile is $var
.
}
if [ 1 -eq 1 ]; then
  var=hello
  heredoc_test
fi