Я пытаюсь передать аргумент как максимальное ограничение для цикла for следующим образом:
#!/bin/bash
for i in {1..$1}
do
echo $i
done
Это возвращает {1..2}
при вызове с аргументом 2
вместо выполнения script и дает мне
1
2
Я пытаюсь передать аргумент как максимальное ограничение для цикла for следующим образом:
#!/bin/bash
for i in {1..$1}
do
echo $i
done
Это возвращает {1..2}
при вызове с аргументом 2
вместо выполнения script и дает мне
1
2
Переменные замены не выполняются внутри фигурных скобок. Вы можете использовать фиксированные числа, но не переменные.
Расширение скобки
Выражение последовательности принимает вид {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
Это будет цикл через все истинные аргументы (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
... или в маловероятном случае, когда вам действительно нужны последовательные номера:
seq $1
: -)
Как и решение Джона Кугельмана, вы можете использовать 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})
Использует замену процесса.