[ Megoldva ] Automatikus dátumformaváltás vagy sh mágia?

Van egy sh scriptem, ami háromféle tevékenységet csinál, attól függően, hogy az aktuális nap 3-mal osztva milyen maradékot ad.

Ez évek óta rendben fut is. A következő kóddal számolom a maradékot:

#!/bin/sh
DAY=`date +%j`
CLASS=$(($DAY % 3))

Ma reggelre azonban ez a kód már nem fut le, a következő hibaüzenetet adja:

arithmetic expression: expecting EOF: "008 % 3"

Gyanítom, a hiba ott lehet, hogy nem 8 az osztandó, hanem 008. De miért is? Hogyan is történhetett ez? Vagy eddig ez miért nem volt hiba? Ráadásul automatikus frissítés sincs a háttérben, így még az upgrade sem lehet a változás forrás.

Tipp? Nálam sz@ródott el valami, vagy ez már nálatok is hibára fut? És hogyan javíthatom?

Hozzászólások

Egy sorral kibővítve a kódot, eltűnnek a vezető nullák, és így a hiba nem jelentkezik:

#!/bin/sh
DAY=`date +%j`
DAY=${DAY##0*0}
CLASS=$(($DAY % 3))

Persze ettől még nem derült fény a változás okára ...

A $(( 007 % 3 )) művelet még helyes. Azt ugyanis oktálisan értelmezi. 008-nál jött ki először a hiba.

vagy akar igy is:

$ DAY=$(printf "%.0f" $(date +%j)); echo $DAY
8

A %j az a day of year, 001-től 366-ig terjed.

Neked viszont 1...366 kell, mert a 0-val kezdődő értékek oktálisan értelmezendők.

Érdekes, hogy ez nálad évek óta helyesen fut. Nem kéne neki.

Attól függ, mire mutat a /bin/sh

Bash-ban hibás, mert a 008-at oktálisnak akarja értelmezni. Ksh-ban vagy zsh-ban rendben fut.

A $(()) kifejezésekben meg lehet adni a konstansokhoz a számrendszert, amelyben értelmezni óhajtjuk azokat. Próbáld ezt: $((10#$DAY % 3)).

 

       Constants with a leading 0 are interpreted as octal numbers.  A leading
       0x or  0X  denotes  hexadecimal.   Otherwise,  numbers  take  the  form
       [base#]n,  where the optional base is a decimal number between 2 and 64
       representing the arithmetic base, and n is a number in that  base.   If
       base#  is omitted, then base 10 is used.  The digits greater than 9 are
       represented by the lowercase letters, the uppercase letters, @, and  _,
       in  that  order.   If  base  is less than or equal to 36, lowercase and
       uppercase letters may be  used  interchangeably  to  represent  numbers
       between 10 and 35.

"Nálam sz@ródott el valami,"

Valszeg lecserélődött a default shell bashra valamelyik update során.

Szerkesztve: 2021. 01. 08., p – 22:21
echo $((`date +%-j` % 3))

 

 

 

 

 

A date-nek meg tudod adni, hogy ne legyen zero padding:

date +%-j

Szerkesztve: 2021. 01. 09., szo – 08:47

Nem történt semmilyen változás, csak amikor üzembe helyezted tavaly, akkor már háromjegyű volt ez a %j szám, tehát nem volt vezető nulla. (Tehát 2020. április 9-én, vagy az után.)

Szerk: de ha valóban évek óta így megy, akkor csak az ellenőrzés volt elégtelen;)