Newsgroup: it.comp.os.linux.iniziare
Titolo: bash -- non ci capisco nulla

leggo in una dispensa sulla bash quanto segue:
if [ -x "$nomefile" ]; then    #  Notate che "if" e "then" hanno bisogno 
del
                               #+ punto e virgola. Perché?
la guida pero' non spiega il motivo della necessita del punto e virgola. 
me lo dite voi? 
grazie


ciao
bash ha una logica piuttosto diversa dagli altri linguaggi...
ci vuole un po' per capirla...
comunque if e then vanno separati per lo stesso motivo per cui si 
separano due comandi (per esempio sleep 5; echo OK)
infatti, se li metti su righe diverse, il punto e virgola non serve piu'...
if [ -x "$nomefile" ]
then
probabilmente perche' internamente trattati come due comandi distinti


considera le due regole seguenti (come t'è già stato risposto
più o meno...):
1- il costrutto if ha la seguente forma:
if [ condizione ]
then
  operazioni
 else
  altre operazioni
fi
2- in bash il ";" in determinati casi significa "vai a capo"
Quindi se metti insieme 1 e 2, il significato del tuo esempio
sembra più chiaro:
if [ cond ] |equivale
then        |   a ---> if [ cond ]; then
questo non vale per l'acapo dopo il then però, infatti
if [ cond ]; then; opera1
dà errore.
invece sarebbe giusto così:
if [ cond ]; then opera1; operaN; else operaA; operaX; fi
puoi provare anche da riga di comando a usare la forma
precedente (considera tutto su una riga):
clear; echo "digita la tua passwd"; read var; if [ "$var" = "la tua
passwd" ]; then echo "congratulazione hai risolto  <invio per
uscire>"; read; else echo "spiacente stringa incorretta:
riprovaci    <invo per uscire>"; read; fi
Mi spiace ma su una riga non ci stava...tu prova ascriverlo
tutto sulla stessa riga anche al prompt della bash...è un esempio
stupido tanto per farti capire il punto e virgola.
funziona analogamente anche con gli altri cstrutti:
while [ cond ]
do
  bla
  bla
done
--> while [ cond ]; do bla; bla; done
--> while [ cond ]; do
      bla
      bla
    done
Fai delle prove con diverse combinazioni di ";"...
Saluti, ah ti consiglio di tenre tra i segnalibri del tuo browser
la guida di Mendel Cooper (advanced bash scripting):
http://www.pluto.it/files/ildp/guide/abs/index.html



 Fai delle prove con diverse combinazioni di ";"...
e il  /usr/bin/[  ? dove lo mettiamo? è un programma che valuta cosa gli 
passi come argomento, (e che devi chiudere con una ]  come parametro )

 passi come argomento, (e che devi chiudere con una ]  come parametro )
AFAIK bash offre [ come builtin, ma il discorso di fondo non cambia :)
-- 
By ZeD

 passi come argomento, (e che devi chiudere con una ]  come parametro )
C'č sempre qualcosa da imparare allora...
Credevo che fosse semplicemente un costrutto sintatticamente cosě
e basta.
A pensarci bene dando "man test" si hanno informazioni riguardo
ciň cui ti riferivi penso.
Il fatto che lo scriptino funzioni, mi ha reso poco preciso  ;-)


ho riflettuto un po'... e credo di aver capito il motivo...
il comando if testa il valore di ritorno del comando che segue...
tu potresti benissimo fare
if ls -l
then
   echo "OK"
fi
e il comando puo' avere dei parametri... e tra questi per assurdo 
potrebbe anche esserci un 'then'... quindi per far stare tutto su una 
riga va indicato quando i parametri finiscono...
if echo then; then echo "OK"; fi

JohnnyNewbie ha scritto:

Era per dire ... che si potrebbe anche scrivere:
if test -x "nomefile" ; then
     ......
fi
:)

 if echo then; then echo "OK"; fi
Quello che mi lascia un attimo più spaesato è il perchè funzioni
sia la forma
then
  echo
  ...
Che la forma 
then echo
senza bisogno di ";"
Non so se mi sono spiegato bene circa il dubbio...

 senza bisogno di ";"
non so dirti.. e' la sua sintassi... pero' considera che funziona anche 
questa forma:
if
test $a
then
echo ok
fi
se portati in una sola riga, if e then non richiedono il ; per il 
comando che segue, mentre il comando stesso si.
if test $a; then echo ok; fi
vabbuo'... ma poi con un po' di pratica viene automatico
ciao
ma il

 vabbuo'... ma poi con un po' di pratica viene automatico
Certo certo, era solo curiosità.
Va bene, penso che qualche dubbio dell'OP sia stato chiarito
probabilmente.
Saluti  :-)

 me lo dite voi?
Semplicemente perché la sintassi di bash lo prevede:
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
Il ";" lo puoi evitare andando a capo:
if [ "$test" = "good" ]
then
    echo "true"
else
    echo "false"
fi
Quando hai dei dubbi di "base", ti conviene dare una sbirciatina a "man 
bash" (da dove tra l'altro ho preso la sintassi di cui sopra). 
In alternativa c'è pure l'ottima "guida avanzata di scripting bash" che 
trovi pure in Italiano:
http://www.pluto.it/files/ildp/guide/abs/index.html
-- 
no signature yet