2011-01-31 9 views
11

Desidero scrivere un ciclo annidato che deve funzionare nel prompt della shell bash. nidificato per il ciclo nel comando Linea singola.bash shell annidato per loop

Ad esempio,

for i in a b; do echo $i; done 
a 
b 

Nell'esempio precedente, per il ciclo viene eseguito in un singolo comando retta. In questo modo ho provato il ciclo annidato per il prompt della shell. La sua non funziona. Come fare questo. Per favore aggiornami su questo.

+0

-bash-3.00 # per i in a b; fai eco $ i; fatto a b -bash-3.00 # – rashok

+0

nei suddetti commenti ho menzionato per rappresentare la nuova riga ... il comando è "per i in ab; fare echo $ i; fatto" – rashok

+0

Si prega di modificare la domanda, fare non aggiungere questo tipo di commenti. Ho modificato per evidenziare il codice ... – Drakosha

risposta

16

Questo non è un ciclo annidato, solo un singolo ciclo. E la versione nidificato funziona, troppo:

# for i in a b; do for j in a b; do echo $j; done; done 
a 
b 
a 
b 
+1

ho già provato questo ... sto ricevendo errore ... "Errore di sintassi vicino token inaspettato 'echo'" ... sto provando questo in bash ... – rashok

+1

L'ho fatto in bash ... quale shell sono stai usando? Almeno hai taggato questa domanda "bash", quindi dovrebbe essere chiaro. – Daniel

+1

@ashok: questo errore probabilmente significa che manchi un 'do' da qualche parte. –

21

One una linea (punto e virgola necessarie):

for i in 0 1 2 3 4 5 6 7 8 9; do for j in 0 1 2 3 4 5 6 7 8 9; do echo "$i$j"; done; done 

formattato per la leggibilità (senza punti e virgola necessari):

for i in 0 1 2 3 4 5 6 7 8 9 
do 
    for j in 0 1 2 3 4 5 6 7 8 9 
    do 
     echo "$i$j" 
    done 
done 

Ci sono diverse viste su come il codice shell dovrebbe essere disposto su più righe; si tratta di ciò che uso normalmente, a meno che non metta l'operazione successiva sulla stessa riga dello do (salvando qui due righe).

+0

Perché non fare qualcosa del tipo in $ (seq 0 9) invece di scrivere ogni numero nella sequenza? – SummerEla

+2

@SummerEla: potresti '$ (seq 0 9)'; in Bash, potresti anche scrivere 'for i in {0..9}'. Ci sono molti modi che potrebbero essere usati. Il vantaggio di non usare 'seq' è che salva sui processi (11 di essi). È improbabile che si tratti di un problema, ma è un motivo nominale per l'utilizzo di una delle notazioni alternative (quella nella risposta o l'espansione della parentesi). Nota che l'espansione delle parentesi graffe non è molto flessibile e nemmeno l'elenco dei numeri scritto. La notazione 'seq' consente di controllare l'intervallo con limiti variabili. Tutto dipende da cosa stai cercando. –

+0

Grande spiegazione, grazie @Johnathan Leffler – SummerEla

3
#!/bin/bash 
# loop*figures.bash 

for i in 1 2 3 4 5 # First loop. 
do 
    for j in $(seq 1 $i) 
    do 
     echo -n "*" 
    done 
    echo 
done 
echo 
# outputs 
# * 
# ** 
# *** 
# **** 
# ***** 

for i in 5 4 3 2 1 # First loop. 
do 
    for j in $(seq -$i -1) 
    do 
     echo -n "*" 
    done 
    echo 
done 

# outputs 
# ***** 
# **** 
# *** 
# ** 
# * 

for i in 1 2 3 4 5 # First loop. 
do 
    for k in $(seq -5 -$i) 
    do 
     echo -n ' ' 
    done 
    for j in $(seq 1 $i) 
    do 
     echo -n "* " 
    done 
    echo 
done 
echo 

# outputs 
#  * 
# * * 
# * * * 
# * * * * 
# * * * * * 

for i in 1 2 3 4 5 # First loop. 
do 
    for j in $(seq -5 -$i) 
    do 
     echo -n "* " 
    done 
    echo 
    for k in $(seq 1 $i) 
    do 
     echo -n ' ' 
    done 
done 
echo 

# outputs 
# * * * * * 
# * * * * 
# * * * 
# * * 
#  * 


exit 0 
+2

Si prega di fornire alcune spiegazioni in aggiunta al codice. – Jan