используйте -s ex: seq -s '' 1 10 вывод: 1 2 3 4 5 6 7 8 9 10

от вопрос уже есть ответ здесь:

Как мне перебрать диапазон чисел, определенных переменными в Bash? 18 ответов

Можно ли сделать что-то вроде этого:

start=1
end=10
echo {$start..$end}
# Ouput: {1..10}
# Expected: 1 2 3 ... 10 (echo {1..10})

Ответы на вопрос(6)

Вы должны использоватьeval:

eval echo {$start..$end}
 Charles Duffy26 сент. 2013 г., 22:17
Это все равно что использовать отбойный молоток, чтобы забить гвоздь. Это опасно (буквально, представляет потенциальные уязвимости при внедрении оболочки, если любое из ваших значений происходит от ненадежных входных данных), и не является подходящим инструментом для работы.for ((i=start; i<end; i++)); do ...; done.

Я обычно просто делаю это:

echo `seq $start $end`
 ilkkachu16 мая 2017 г., 15:32
Не говоря уже о том, чтоseq нестандартно, но подстановка команды echo + просто глупая комбинация.
 Tyilo31 мая 2011 г., 19:30
Посмотрите на мой комментарий к ответу cnicutar
 Bruno Bronosky29 янв. 2019 г., 20:34
@ilkkachu нет, если вам нужно добавить новую строку.
 ilkkachu29 янв. 2019 г., 20:48
@ BrunoBronosky, ну, большая разница в том, что подстановка команды без кавычек сбрасывает пробел в один пробел (если толькоIFS изменено по умолчанию). Таким образом, вы получаете все цифры в одной строке, а не в одной строке, как по умолчанию сseq, Но если вы хотите этого, вы можете просто использоватьseq -w ' ' 1 10, Если вы цитируете подстановку команд, с другой стороны, тогдаecho "$(seq 1 10)" а такжеseq 1 10 имеют точно такой же выход. Подстановка команд удаляет завершающие символы новой строки (есть одна), иecho добавляет один обратно.
 Charles Duffy26 сент. 2013 г., 22:18
seq это нестандартный инструмент (буквально, не указан в POSIX).

Вы должны рассмотреть возможность использованияseq(1), Вы также можете использовать eval:

eval echo {$start..$end}

И вотseq

seq -s' ' $start $end
 Charles Duffy27 сент. 2013 г., 06:02
@opsguy coreutils! = стандарт POSIX. Конечно, он есть в Linux, но в мире больше операционных систем.
 Tyilo31 мая 2011 г., 19:33
И Seq также не рекомендуется в любом случае
 Tyilo31 мая 2011 г., 19:30
У меня нет команды seq в моей оболочке
 ilkkachu16 мая 2017 г., 15:34
с помощьюeval здесь так же ужасно, как и в большинстве других мест, не привыкайте к этому, или вы однажды оставите уязвимости, связанные с инъекциями команд
 opsguy31 мая 2011 г., 20:16
@Tyilo В какой оболочке / ОС ты? Solaris? Я никогда не видел, чтобы seq отсутствовал ни в одном дистрибутиве Linux. На самом деле, это даже в ядре GNU:gnu.org/s/coreutils/manual/html_node/seq-invocation.html

ЗШ обрабатывает это так, как вы хотите. Это не будет работать в BASH, потому что расширение скобки происходит раньше любого другого типа расширения, такого как расширение переменной. Поэтому вам нужно будет использовать альтернативный метод.

Какая-то конкретная причина, по которой вам нужно объединить скобки и расширение переменных? Возможно, другой подход к вашей проблеме устранит необходимость в этом.

 Tyilo31 мая 2011 г., 19:59
Да, я использую Bash

Если у вас нетseqВы можете придерживаться простой для цикла

for (( i=start; i<=end; i++ )); do printf "%d " $i; done; echo ""
Решение Вопроса

поэтому это невозможно сделать напрямую.

Вместо этого используйте арифметикуfor цикл:

start=1
end=10
for ((i=start; i<=end; i++))
do
   echo "i: $i"
done
ВЫХОД
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10
 anubhava02 окт. 2012 г., 14:01
@Letharion Спасибо за ваш комментарий, это был ответ более года назад, но так как вы прокомментировали, я обновил свой ответ и предоставил лучшую альтернативу. Пожалуйста, проверьте.
 Letharion02 окт. 2012 г., 10:23
Разве не в этом вопрос, что числа в цикле должны быть переменными?
 syss20 мар. 2018 г., 14:37
это возможно, но это немного уродливо, потому что каждый запускает другую оболочку, чтобы выполнить расширение переменной до расширения фигурной скобки:start=1;end=10;for i in $(bash -c "echo {$start..$end}");do echo $i;done
 philcolbourn08 мар. 2014 г., 04:00
и должно ли быть выходное значение 1 2 3 4 5 6 7 8 9 10?

Ваш ответ на вопрос