Я получил следующее на работу:
for i in {2..10}
do
echo "output: $i"
done
Он производит кучу строк output: 2
, output: 3
и так далее.
Тем не менее, пытаясь запустить следующее:
max=10
for i in {2..$max}
do
echo "$i"
done
производит следующее:
output: {2..10}
Как я могу заставить компилятор понять, что он должен обрабатывать $ max как другой конец массива, а не как часть строки?
echo "$i
должно бытьecho "$i"
- не решит проблему, хотя.do
иthen
ключевые слова на той же линии , какfor
иif
, соответственно. Например,for i in {2..10}; do
Ответы:
Раскрытие скобок , {x..y} выполняется перед другими раскрытиями, поэтому вы не можете использовать это для последовательностей переменной длины.
Вместо этого используйте
seq 2 $max
метод, как указано пользователем mob .Итак, для вашего примера это будет:
источник
seq
для подсчета и приращения чисел в цикле for, поэтому рекомендуется избегать ее использованияseq
. Эта команда оставлена для совместимости со старым bash. Встроенные команды достаточно быстрые.for (( EXP1; EXP2; EXP3 )) ...
for (( ... ))
синтаксис не POSIX, и это означает, например, что он не будет работать из коробки на вещах, таких как Alpine Linux.seq
делает.#!/bin/sh
это Dash в Debian / Ubuntu.Попробуйте версию с арифметическим выражением
for
:Это доступно в большинстве версий bash и должно быть совместимо с Bourne shell (sh).
источник
sh
, вместо этого делая ее ссылкой на другую оболочку. В идеале, такая оболочка вызывается какsh
бы только поддерживать эти функции в стандарте POSIX, но по умолчанию пусть некоторые из своих дополнительных функций через. Цикл for в стиле C не является функцией POSIX, но может быть вsh
режиме реальной оболочки.Шаг цикла вручную:
Если вам не нужно быть полностью POSIX, вы можете использовать арифметику для цикла:
Или используйте jot (1) в системах BSD:
источник
true $(( i++ ))
не работает во всех случаях, так что большинство портативных будетtrue $((i=i+1))
.Есть несколько способов сделать это.
источник
eval
как оценит все, что вы установилиmax
. Подумайтеmax="2}; echo ha; #"
, затем заменитеecho ha
чем-нибудь более разрушительным.Если
seq
команда доступна в вашей системе:Если нет, то используйте бедняков
seq
сperl
:Смотреть эти кавычки.
источник
Это способ:
Bash:
Выше Bash способ будет работать
ksh
иzsh
тоже, когдаbash -c
заменяетсяksh -c
илиzsh -c
соответственно.Примечание:
for i in {2..${max}}; do echo $i; done
работает вzsh
аksh
.источник
Мы можем повторять цикл, как в C-программировании.
источник
Здесь это работало на Mac OS X.
Он включает в себя пример даты BSD, как увеличить и уменьшить дату также:
источник
Ну, поскольку у меня не было
seq
команды, установленной в моей системе (Mac OS X v10.6.1 (Snow Leopard)), яwhile
вместо этого использовал цикл:* Пожимает плечами * все, что работает.
источник
Все они делают
{1..8}
и должны быть POSIX. Они также не сломаются, если вы поместите условиеcontinue
в цикл. Канонический способ:По-другому:
и другой:
источник
Использование:
Вам нужен явный вызов 'eval', чтобы переоценить {} после подстановки переменной.
источник