Итерация по оболочке диапазона

#shell #zsh

#оболочка #zsh

Вопрос:

 for a in bar
do
    for b in 1000000
    do
        montage -geometry 500 $a-$b-*-${0..20000..1000}.png 
        $a-$b-${0..20000..1000}-final.jpg
    done
done
 

Я не могу получить все изображения с 0 1000 2000 ... 20000 использованием number $(0..20000.1000) .

Есть ли в оболочке другой способ сделать это?

Ответ №1:

Не должно быть $ before {START..END..STEP}

 % echo -{0..20000..1000}-                                    
-0- -1000- -2000- -3000- -4000- -5000- -6000- -7000- -8000- -9000- -10000- -11000- -12000- -13000- -14000- -15000- -16000- -17000- -18000- -19000- -20000-
 

При этом вам нужен цикл для перебора этих чисел. Слово, содержащее диапазон, просто заменяется его расширением. Это означает, что командная строка вызывается не для каждого элемента отдельно, а для всех их вместе. Это также означает, что, даже если вы используете один и тот же диапазон дважды, их расширение не будет удобно комбинировать.

Сравнить

 % echo start a-{1..3}-b A-{1..3}-B end
start a-1-b a-2-b a-3-b A-1-B A-2-B A-3-B end
 

и

 % for n in {1..3}; do echo start a-$n-b A-$n-B end; done
start a-1-b A-1-B end
start a-2-b A-2-B end
start a-3-b A-3-B end
 

Итак, в вашем примере вместо

 montage -geometry 500 $a-$b-*-${0..20000..1000}.png 
    $a-$b-${0..20000..1000}-final.jpg
 

вы, вероятно, хотите сделать

 for n in {0..20000..1000}; do
    montage -geometry 500 $a-$b-*-$n.png $a-$b-$n-final.jpg
done
 

Ответ №2:

 #!/usr/bin/env python

import os

file_names= ["a","b"]


ranges =  list(xrange(0, 20000, 1000))
l_s = list()
for f in range(0, len(file_names)):
    for a in range(0, len(ranges)):
        stringing = str(file_names[f])   "--1000000-0-0-0-1-"   str(ranges[a])   ".log.png"
        l_s.append(stringing)

    final = " ".join(l_s)
    foo = "montage -geometry 500 "   str(final)   " "   str(file_names[f])  "-final.jpg"
    os.system(foo)
 

Комментарии:

1. Python выполнил эту работу за меня.

2. Я знаю, что вы были OP, но вы попросили решение оболочки, поэтому ответ с помощью Python не поможет следующему парню.