Подтвердить что ты не робот

Аргументы, переданные в цикл в bash script

Я пытаюсь передать аргумент как максимальное ограничение для цикла for следующим образом:

#!/bin/bash

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

Это возвращает {1..2} при вызове с аргументом 2 вместо выполнения script и дает мне

1
2
4b9b3361

Ответ 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

Ответ 2

Это будет цикл через все истинные аргументы (a.k.a. "testo mesto" - один из аргументов)

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

ИЛИ

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

Ответ 3

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

seq $1

: -)

Ответ 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})

Использует замену процесса.