62

I want to write a nested for loop that has to work in the bash shell prompt. nested for loop in Single line command.

For example,

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

In the above example, for loop is executed in a single line command right. Like this I have tried the nested for loop in the shell prompt. Its not working. How to do this. Please update me on this.

4
  • -bash-3.00# for i in a b; do echo $i; done <next-line>a <next-line>b <next-line>-bash-3.00#
    – rashok
    Commented Jan 31, 2011 at 5:18
  • in the above comments i have mentioned <next-line> to represend the new line... command is "for i in a b; do echo $i; done"
    – rashok
    Commented Jan 31, 2011 at 5:22
  • Please EDIT your question, do not add this kind of comments. I edited to highlight the code...
    – Drakosha
    Commented Jan 31, 2011 at 5:23
  • Saying "it's not working" conveys no information. How does the behavior differ from what you expect? What error messages are you getting? What have you tried? Commented Jan 31, 2011 at 6:16

3 Answers 3

77

The question does not contain a nested loop, just a single loop. But THIS nested version works, too:

# for i in c d; do for j in a b; do echo $i $j; done; done
c a
c b
d a
d b
0
69

On one line (semi-colons necessary):

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

Formatted for legibility (no semi-colons needed):

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

There are different views on how the shell code should be laid out over multiple lines; that's about what I normally use, unless I put the next operation on the same line as the do (saving two lines here).

2
  • Why not do something like for i in $(seq 0 9) instead of writing out each number in the sequence?
    – SummerEla
    Commented Dec 21, 2015 at 18:13
  • 3
    @SummerEla: You could $(seq 0 9); in Bash, you could write for i in {0..9} too. There are lots of ways that could be used. The advantage of not using seq is that it saves on processes (11 of them). You're unlikely to find that's a problem, but it is a nominal reason for using one of the alternative notations (the one in the answer, or the brace expansion). Note that brace expansion is not very flexible - and neither is the written out list of numbers. The seq notation allows you to control the range with variable limits. It all depends on what you're after. Commented Dec 21, 2015 at 18:20
13
#!/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
  • 7
    Please provide some explanation in addition to the code.
    – Jan
    Commented Mar 24, 2017 at 7:50
  • You are a savior :) Commented Jan 11, 2021 at 8:01

Not the answer you're looking for? Browse other questions tagged or ask your own question.