В ударе действительно ли возможно использовать целочисленную переменную в управлении циклом для цикла?

Принятие xz соблюдает стандартный набор флагов командной строки - включая флаги уровня сжатия, Вы могли попробовать:

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 
66
10.11.2012, 22:24
4 ответа

Причиной этого является порядок, в котором вещи происходят в ударе. Расширение фигурной скобки происходит, прежде чем переменные расширены. Для выполнения цели необходимо использовать C-стиль для цикла:

upperlim=10

for ((i=0; i<=upperlim; i++)); do
   echo "$i"
done
64
27.01.2020, 19:31
  • 1
    И работы для zsh также (но не для csh, tcsh). –  math 04.01.2013, 19:48

Для завершения этого в стиле, использующем только созданный-ins, необходимо было бы использовать оценку:

d=12

for i in `eval echo {0..$d}`
do
echo $i
done

Но с seq:

lowerlimit=0
upperlimit=12

for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done

Лично я нахожу использование seq быть более читаемым.

29
27.01.2020, 19:31
  • 1
    Для "созданного-ins"? seq внешняя команда и не доступна, везде колотят. –  jordanm 10.11.2012, 22:42
  • 2
    @jordanm: Для использования всего builtins с ударом. Затем я сказал, "но с seq", подтверждение, что это не встроенное. –  Jodie C 10.11.2012, 22:43
  • 3
    То, что расширение фигурной скобки встроено, не является проблемой здесь. read встроенное, например, но нет никакой причины для eval это. –  jordanm 10.11.2012, 22:43
  • 4
    Builtins не проблематичен вообще. Я хотел предоставить решение все-удара для автора вопроса. Если Вы хотите продолжать спорить об этом, возьмите его для обсуждения; комментарии не хороши для этого вида вещи –  Jodie C 10.11.2012, 22:49

Ваш подход не будет работать, поскольку в bash фигурная скобка происходит до раскрытия параметра. Перед этим вам нужно расширить переменную.

Вы можете обойтись с помощью eval :

upperlim=10
eval '
        for i in {0..'"$upperlim"'}
        do
                echo $i
        done
'

С помощью цикла while :

upperlim=10
#with while
start=0
while [[ $start -le $upperlim ]]
do
    echo "$start"
    ((start = start + 1))
done

Также вы можете сделать это с помощью команды seq :

upperlim=10
#seq
for i in $(seq "$upperlim"); do
  echo "$i"
done

Если вы хотите работать с для i в {0 .. $ upperlim} , вам нужно будет использовать kornshell. например:

#!/bin/ksh
upperlim=10

for i in {0..$upperlim}
do
        echo $i
done
1
27.01.2020, 19:31

Способ POSIX

Если вам важна переносимость, используйте пример из стандарта POSIX :

i=2
END=5
while [ $i -le $END ]; do
    echo $i
    i=$(($i+1))
done

Вывод:

2
3
4
5

Вещи, которые не POSIX:

8
27.01.2020, 19:31

Теги

Похожие вопросы