оболочка bash, вложенная в цикл - PullRequest
23 голосов
/ 31 января 2011

Я хочу написать вложенный цикл, который должен работать в командной строке bash.вложенный для цикла в однострочной команде.

Например,

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

В вышеприведенном примере цикл for выполняется в одной строке справа.Вот так я пробовал вложенный цикл for в командной строке.Это не работает.Как это сделатьПожалуйста, сообщите мне об этом.

Ответы [ 3 ]

33 голосов
/ 31 января 2011

Это не вложенный цикл, просто один цикл. И вложенная версия тоже работает:

# for i in a b; do for j in a b; do echo $j; done; done
a
b
a
b
31 голосов
/ 31 января 2011

Одна строка (необходимые точки с запятой):

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

Отформатировано для разборчивости (без точек с запятой):

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

Существуют разные представления о том, как код оболочки должен быть размещен на нескольких строках; это то, что я обычно использую, если я не помещаю следующую операцию в ту же строку, что и do (сохраняя две строки здесь).

4 голосов
/ 24 марта 2017
#!/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
...