it-swarm.com.ru

Сценарий оболочки "для" синтаксиса цикла

Я получил следующее на работу:

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 как другой конец массива, а не как часть строки?

173
eykanal

Раскладка скобок, {x..y} выполняется перед другими раскрытиями, поэтому вы не можете использовать это для последовательностей переменной длины.

Вместо этого используйте метод seq 2 $max как указано пользователем mob .

Итак, для вашего примера это будет:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done
212
whatsisname

Попробуйте версию арифметического выражения for:

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

Это доступно в большинстве версий bash и также должно быть совместимо с Bourne Shell (sh).

66
system PAUSE

Шаг цикла вручную:

 i = 0 
 max = 10 
 в то время как [$ i -lt $ max] 
 делают 
 echo "output: $ i" 
 true $ ((i ++)) 
 сделано 

Если вам не нужно быть полностью POSIX, вы можете использовать цикл арифметики for:

 max = 10 
 for ((i = 0; i <max; i ++)); сделать эхо "output: $ i"; сделанный

Или используйте jot (1) в системах BSD:

 для i в $ (jot 0 10); сделать эхо "output: $ i"; сделанный
27
Nietzche-jou

Есть несколько способов сделать это.

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done
9
ephemient

Если команда seq доступна в вашей системе:

for i in `seq 2 $max`
do
  echo "output: $i"
done

Если нет, то используйте имя seq бедняка с Perl:

seq=`Perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

Смотреть эти кавычки.

8
mob

Это способ:
[. .____] Bash:

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done

Вышеупомянутый способ Bash будет работать и для ksh и zsh, когда bash -c заменяется на ksh -c или zsh -c соответственно.

Примечание: for i in {2..${max}}; do echo $i; done работает в zsh и ksh.

4
Jahid

Мы можем повторять цикл, как в C-программировании.

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do 
      echo $i
done
4
rashedcs

Здесь это работало на Mac OS X.

Он включает в себя пример даты BSD, как увеличить и уменьшить дату также:

for ((i=28; i>=6 ; i--));
do
    dat=`date -v-${i}d -j "+%Y%m%d"` 
    echo $dat
done
2
minhas23

Ну, так как у меня не было команды seq, установленной в моей системе (Mac OS X v10.6.1 (Snow Leopard)), я вместо этого использовал цикл while:

max=5
i=1

while [ $max -gt $i ]
do
    (stuff)
done

* пожимает плечами * Что бы ни работало.

2
eykanal

Все они делают {1..8} и должны быть POSIX. Они также не сломаются, если вы поместите условное continue в цикл. Канонический способ:

f=
while [ $((f+=1)) -le 8 ]
do
  echo $f
done

По-другому:

g=
while
  g=${g}1
  [ ${#g} -le 8 ]
do
  echo ${#g}
done

и другой:

set --
while
  set $* .
  [ ${#} -le 8 ]
do
  echo ${#}
done
1
user4427511

Использование:

max=10
for i in `eval echo {2..$max}`
do
    echo $i
done

Вам нужен явный вызов 'eval', чтобы переоценить {} после подстановки переменной.

1
Chris Dodd