LINUX.ORG.RU

Ответ на: комментарий от anonymous

сойдёт? for i in {0..364}; do

Вы заранее захаркодили, что год не високосный bash-измом, следовательно 365 вызовов date вообще не надо, заодно и ‘| xargs’ уйдёт.

declare -i m d md=(31 28 31 30 31 30 31 31 30 31 30 31)
for m in {0..11}; do
 for ((d = 1; md[m] >= d; d++)); do
   printf -v f "%02d.%02d.2019" $d $((m+1))
   touch $f
 done
done
vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от anonymous

А, странное условие, ну да ладно. Всё равно без магических чисел красивее. Заодно и touch только один раз вызывать можно:

startd=11
startm=1

declare -i m d md=(0 31 28 31 30 31 30 31 31 30 31 30 31) j
for m in {1..12}; do
 [[ m -lt startm ]] && continue
 for ((d = 1; md[m] >= d; d++)); do
   [[ startm -eq m && d -lt startd ]] && continue
   printf -v "o[j++]" "%02d.%02d.2019" $d $m
 done
done
touch ${o[@]}

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 2)

Ребята спасибо Вам огромное.

Я не студент. Просто пришли компьютеры на Линукс и с ними тесты. А я с ними раньше никогда не работал. Спасибо еще раз за помощь.

serg200883 ()
Ответ на: комментарий от bl

Ну у вас тоже не с 11.01.2019 начинается. Вот для любых (конец для демонстрации выбран выше):

d=11
m=01
y=2019

endd=09
endm=03
endy=2020

declare -i md=(0 31 0 31 30 31 30 31 31 30 31 30 31) j em ed
d=$((10#$d))
m=$((10#$m))
for ((; y <= endy; y++)); do
 md[2]=y%4==0?29:28
 em=$((y == endy ? 10#$endm : 12))
 for ((; m <= em; m++)); do
   ed=$((y == endy && m == em ? 10#$endd : md[m]))
   for ((; d <= ed; d++)); do
       printf -v "o[j++]" "%02d.%02d.%d" $d $m $y
   done
   d=1
 done
 m=1
done
xargs touch ${o[@]}

vodz ★★★★★ ()
Ответ на: комментарий от vodz

разница от моего предыдущего в том, как вычислялась нужная дата. по номеру дня в году.
анонимус предлагает кол-во секунд в сутка * кол-во дней + волшебный таймштамп начала года.
-d @$(echo «1546326000+86400*$i» | bc)
я предгалаю лексический анализатор утилиты встроенный в эту опцию
2019-01-01 1 day -> 2019-01-02
и пусть date сам вычисляет сколько дней в том месяце и т.п.
вкалывают роботы - счастлив человек
а ньюанс с какого числа по какое, надо с 11 января - пусть тс пропишет в волшебную дату 2019-01-11.

bl ★★★ ()
Ответ на: комментарий от bl

анонимус предлагает кол-во секунд в сутка * кол-во дней + волшебный таймштамп начала года.

Да там магическое число тоже можно вычислить и написать комментарий. Главная проблема ваших скриптов не в этом, а в том, что вы 350 раз вызываете data.

а ньюанс с какого числа по какое, надо с 11 января - пусть тс пропишет в волшебную дату 2019-01-11.

Но еще и сравнивать с конечной датой придётся для выхода из цикла. Подсказка: ваше магическое число – 364.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от mitia_1305

Тот скрипт, на что вы ответили никак не может начинаться с дня 1, так как первое значение дня там задано 11. Запустите с отладкой bash -x и посмотрите где у вас так странно это происходит.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

написал скрипт по новой, запустил отладку,ошибок нет. Но при запуске скрипта ничего не происходит.Курсор переходит на сл строку и все. Если убрать xargs то выдает ошибку touch.

mitia_1305 ()
Ответ на: комментарий от mitia_1305

Это действительно так, так как мне не нужна была эта толпа файлов и последняя строка была демонстрационной с echo, потому я по привычке echo убрал, чтобы «выключить демонстрацию», хотя для работы оно там действительно надо, потому поменяйте на echo ${o[@]} | xargs touch

Но как у вас там что-то получалось с 1 — загадка. Отладка с bash -x показывает не ошибки, а результат выполнения для анализа где что происходит.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от mitia_1305

touch: missing file operand

Это когда у вас нет в o[] ничего, такое можно в этом скрипте добиться только если стартовые или день или месяц или год больше конечного.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

не понимаю, просто я вбил один в один как вы писали…специально чтоб проверить…свои данные не подставлял пока, мне бы что ваш скрипт сработал потом свои данные подставлю уж

mitia_1305 ()
Ответ на: комментарий от mitia_1305

Ну я уже не знаю, как вам помогать, если вы не даёте данных, где происходит проблема. На бесконечное «у меня не работает» можно только ответить, что «у меня всё работает». Приравняйте дату начала и конца, посмотрите, чему равно j, если не 1, то смотрите в отладке, почему циклы не выполняются.

vodz ★★★★★ ()
Ответ на: комментарий от mitia_1305

это то что вбиваю

  • d=10
  • m=02
  • y=2019
  • endd=11
  • endm=12
  • end=2019
  • declare -i md=(0 31 0 31 30 31 30 31 31 30 31 30 31) j em ed
  • d=$((10#$d))
  • m=$((10#$m))
  • for ((; y <= endy; y++)); do
  • md[2]=y%4==0?29:28
  • em=$((y == endy ? 10#$endm : 12))
  • for ((; m <= em; m++)); do
  • ed=$((y == endy && m == em ? 10#$endd : md[m]))
  • for ((; d <= ed; d++)); do
  • printf -v «o[j++]» «%02d.%02d.%d» $d $m $y
  • done
  • d=1
  • done
  • m=1
  • done
  • echo ${o[@]}|xargs touch
mitia_1305 ()
Ответ на: комментарий от mitia_1305

А вот ещё вопрос, а можно все это сделать при помощи оператора date?

Нет такого оператора. Примеры с командой date выше были, но в общем случае, когда предварительно не захаркодить диапазон, циклы всё равно нужны и возникает вопрос, а накой тогда звать на каждую итерацию внешнюю команду.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)