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?
- 264 megtekintés
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 hozzászóláshoz be kell jelentkezni
Ha a DAY értékét nem használod máshol, akkor: DAY=3`date +%j` és meg van oldva, ha meg igen, akkor CLASS=$((3$DAY % 3)) és kész :-) Én sok éve augusztusban futottam bele hasonló problémába :-)
- A hozzászóláshoz be kell jelentkezni
A $(( 007 % 3 )) művelet még helyes. Azt ugyanis oktálisan értelmezi. 008-nál jött ki először a hiba.
- A hozzászóláshoz be kell jelentkezni
vagy akar igy is:
$ DAY=$(printf "%.0f" $(date +%j)); echo $DAY
8
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
De ez bashism amúgy, és a shell scriptben a user azt jelezte a shebangben, hogy neki bármelyik UNIX shell jó. Azaz nem építhet bash-only funkcionalitásra.
- A hozzászóláshoz be kell jelentkezni
Nem valódi bashism, a ksh is kb 25 éve tudja. Ráadásul már a $(( )) se megy Bourne-shellel, szóval ott el lett kefélve :-(
- A hozzászóláshoz be kell jelentkezni
Ez jó, köszönöm!
- A hozzászóláshoz be kell jelentkezni
"Nálam sz@ródott el valami,"
Valszeg lecserélődött a default shell bashra valamelyik update során.
- A hozzászóláshoz be kell jelentkezni
echo $((`date +%-j` % 3))
- A hozzászóláshoz be kell jelentkezni
A date-nek meg tudod adni, hogy ne legyen zero padding:
date +%-j
- A hozzászóláshoz be kell jelentkezni
Köszi, eddig ez a legszebb megoldás.
- A hozzászóláshoz be kell jelentkezni
ez gnuism, nem mukodik mindenhol.
- A hozzászóláshoz be kell jelentkezni
Szerencsére nálam igen ...
- A hozzászóláshoz be kell jelentkezni
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;)
- A hozzászóláshoz be kell jelentkezni