Это использует процесс замены.

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

Переменные в замене bash seq ({1..10}) [дубликаты] 7 ответов

Я пытаюсь передать аргумент как максимальный предел для цикла for, как это:

#!/bin/bash

for i in {1..$1}
do
    echo $i
done

Это однако возвращает{1..2} когда вызывается с аргументом2вместо того, чтобы выполнить сценарий и дать мне

1
2

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

Как и решение Джона Кугельмана, вы можете использоватьeval нравится:

x=10; for i in $(eval echo {1..$x}); do echo $i; done

Или, если 1 доллар равен 10, то:

set -- 10
for i in $(eval echo {1..$1})
do
    echo $i
done

Вы также можете использовать несколько вариантов:

set -- 1000
eval echo {1..$1} |
while read i
do
    echo $i
done

Или же:

set -- 1000
while read i
do
     echo $i
done <(eval echo {1..$1})

Это использует процесс замены.

Решение Вопроса

зовать фиксированные числа, но не переменные.

Расширение скобок

Выражение последовательности принимает вид {x..y}, где x и y являются целыми числами или одиночными символами. ...

Раскладка скобок выполняется перед любыми другими расширениями, и любые символы, специально предназначенные для других расширений, сохраняются в результате. Это строго по тексту. Bash не применяет синтаксическую интерпретацию к контексту расширения или к тексту между фигурными скобками.

Правильно сформированное расширение скобок должно содержать открывающие и закрывающие скобки без кавычек и хотя бы одну запятую без кавычек или правильное выражение последовательности. Любое неправильно сформированное расширение фигурной скобки остается без изменений.

Попробуйте одну из этих альтернатив:

for ((i = 1; i <= $1; i++)); do
    echo $i
done

# Not recommended with large sequences.
for i in $(seq 1 $1); do
    echo $i
done
 0sh21 янв. 2011 г., 23:36
Спасибо, первое решение сделало это (второе решение устарело). Вы можете изменить2в$1 чтобы соответствовать моему первоначальному вопросу.
 Dennis Williamson22 янв. 2011 г., 02:04
ksh93 а такжеzsh иметь другой порядок расширения:ksh93 -c 'n=3; for i in {1..$n}; do echo $i; done'
 Ignacio Vazquez-Abrams21 янв. 2011 г., 23:20
Ваше решение правильное, но ваши рассуждения неверны. Расширение скобок происходит до замены переменной, но{1..$1} не является допустимым расширением скобки.
 BroSlow12 авг. 2014 г., 10:19
Из любопытства, можете ли вы объяснить, почему$(seq 1 $1) не рекомендуется для больших последовательностей? Я предполагаю, чтоseq имеет значительное снижение производительности, но объяснение может быть полезным, если некоторые пользователи считают, что это связано с общимfor Синтаксис цикла (то есть прояснение того, что это неARG_MAX выпуск)

когда вам действительно нужны последовательные числа:

seq $1

:-)

ин аргумент)

#cycle through all args
for (( i=1; i<=$1; i++ )); do
    eval arg=\$i
    echo "$arg"
done

ИЛИ ЖЕ

#cycle through all args
for (( i=1; i<=$1; i++ )); do
    echo "${!i}"
done

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