Как мне перебрать диапазон чисел, определенных переменными в Bash?

Это произойдет, когда ${proposal.creationDate} фактически вернет String вместо полноправного Date . Исправьте его соответствующим образом.

private Date creationDate;

public Date getCreationDate() {
    return creationDate;
}

Если вы действительно не можете изменить тип для какой-то неочевидной причины, вам нужно сначала проанализировать его с помощью .



Но это простой хак.


Не связанный с проблемой, часы должны быть представлены HH не hh. См. Также SimpleDateFormat javadoc . Год 3911 вместо 2011 в распечатке также предполагает, что вы использовали устаревший конструктор / методы f10 для его создания.

1311
задан codeforester 1 September 2018 в 19:04
поделиться

5 ответов

for i in $(seq 1 $END); do echo $i; done

редактирование: Я предпочитаю seq по другим методам, потому что я могу на самом деле помнить его;)

1476
ответ дан Jiaaro 1 September 2018 в 19:04
поделиться

Можно использовать

for i in $(seq $END); do echo $i; done
23
ответ дан Peter Hoffmann 1 September 2018 в 19:04
поделиться

Это хорошо работает в bash:

END=5
i=1 ; while [[ $i -le $END ]] ; do
    echo $i
    ((i = i + 1))
done
15
ответ дан paxdiablo 1 September 2018 в 19:04
поделиться

обсуждение

Используя seq прекрасно как предложенный Jiaaro. Diablo мира предложила, чтобы цикл Bash постарался не называть подпроцесс с дополнительным преимуществом того, чтобы быть большей памятью дружественным, если $END является слишком большим. Zathrus определил типичную ошибку в реализации цикла, и также подсказал, что с тех пор i текстовая переменная, непрерывные преобразования туда и сюда, числа выполняются со связанным замедлением.

целочисленная арифметика

Это - улучшенная версия цикла Bash:

typeset -i i END
let END=5 i=1
while ((i<=END)); do
    echo $i
    …
    let i++
done

, Если единственная вещь, которую мы хотим, эти echo, тогда мы могли записать echo $((i++)).

ephemient преподавал мне что-то: Bash позволяет for ((expr;expr;expr)) конструкции. Так как я никогда не читал целую страницу справочника для Bash (как, я сделал с оболочкой Korn (ksh) страница справочника, и это было давным-давно), я пропустил это.

Так,

typeset -i i END # Let's be explicit
for ((i=1;i<=END;++i)); do echo $i; done

, кажется, самый эффективный памятью путь (не будет необходимо выделить память для потребления seq вывод, который мог быть проблемой, если КОНЕЦ является очень большим), хотя, вероятно, не “fastest”.

начальный вопрос

eschercycle отметил что { .. b} нотация Bash работает только с литералами; верный, соответственно к руководству Bash. Можно преодолеть это препятствие с синглом (внутренним) fork() без exec() (как имеет место с вызовом seq, какое быть другим изображением требует fork+exec):

for i in $(eval echo "{1..$END}"); do

И eval и echo Bash builtins, но fork() требуется для замены команды (эти $(…) конструкция).

173
ответ дан Community 1 September 2018 в 19:04
поделиться

seq метод является самым простым, но Bash имеет встроенную арифметическую оценку.

END=5
for ((i=1;i<=END;i++)); do
    echo $i
done
# ==> outputs 1 2 3 4 5 on separate lines

for ((expr1;expr2;expr3)); работы конструкции точно так же, как for (expr1;expr2;expr3) в C и подобных языках, и как другой ((expr)) случаи, Bash рассматривает их как арифметику.

379
ответ дан icedwater 1 September 2018 в 19:04
поделиться
  • 1
    @Makis: Попробуйте --simplify-by-decoration опция к журналу мерзавца. – Jakub Narębski 9 September 2010 в 22:47