65

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# 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" Commented Jan 31, 2011 at 5:22
  • Please EDIT your question, do not add this kind of comments. I edited to highlight the code... 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

79

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
Sign up to request clarification or add additional context in comments.

Comments

70

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 Comments

Why not do something like for i in $(seq 0 9) instead of writing out each number in the sequence?
@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.
15
#!/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 Comments

Please provide some explanation in addition to the code.
You are a savior :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.