shell: Tage auswerten

Post Reply
Message
Author
Hora

shell: Tage auswerten

#1 Post by Hora »

Hallo,

ich würde gerne ein Skript schreiben, das auswertet, ob der heutige Tag gerade oder ungerade ist. Dazu habe ich mir folgendes einfallen lassen, was aber leider einen Fehler auswirft, den ich nicht finde

Code: Select all

#!/bin/sh

UNGERADE=`seq -w 1 2 31`
GERADE=`seq -w 2 2 31`
DATUM=undef
TAG=`date +%d`

for TEST in "${GERADE}; do
   expr "${TEST}" = "${TAG}" && DATUM=GERADER_TAG
done

for TEST in "${UNGERADE}"; do
   expr "${TEST}" = "${TAG}" && DATUM=UNGERADER_TAG
done

echo $DATUM

exit0
[/code ]

Als Ausgabe bleibt  $DATUM auf dem Wert undef. Dafür schmeißt expr eine "0" für jede Schleife auf stdout. Wo ist mein Denkfehler?

Tom2
Posts: 3
Joined: 19. May 2005 11:34

#2 Post by Tom2 »

also ich bin auch nicht der grosse Experte (sicher gibt es noch bessere Lösungen), aber so sollte es auch gehen:
[code]
#!/bin/sh

UNGERADE=`seq -w 1 2 31`
GERADE=`seq -w 2 2 31`
DATUM=undef
TAG=`date +%d`

for TEST in "${GERADE}"; do
for TESTI in $TEST; do
if [ $TESTI = $TAG ]; then
DATUM="GERADER TAG"
fi
done
done

for TEST in "${UNGERADE}"; do
for TESTI in $TEST; do
if [ $TESTI = $TAG ]; then
DATUM="UNGERADER TAG"
fi
done
done

echo $DATUM

exit 0
[/code]

Die Ursache war wohl, dass Du die gesamte Reihe mit dem aktuellen Tag vergleichen wolltest.

Gruss
Tom2

Hora

#3 Post by Hora »

Ich habs. Das Problem ist, wenn seq in eine Variable schreibt, dann geht die for Schleife, warum auch immer, nicht jeden Wert durch, sondern nimmt die Variable als einen gesamten String.
Hier nun die Lösung:

Code: Select all

#!/bin/sh

TAG=`date +%d`
ZUSTAND=undef

for TEST in `seq -w 2 2 31`; do
   expr "${TEST}" = "${TAG}" 2>/dev/null 1>&2 && ZUSTAND=GERADER_TAG
done

for TEST in `seq -w 1 2 31`; do
   expr "${TEST}" = "${TAG}" 2>/dev/null 1>&2 && ZUSTAND=UNGERADER_TAG
done

echo ${ZUSTAND}

exit0

kanonenfutter
Posts: 266
Joined: 10. Sep 2004 14:37
Contact:

#4 Post by kanonenfutter »

mit modulo gehts übrigens auch einfacher:

Code: Select all

#!/bin/sh 
TAG=`date +%e` 
MODULO2=$[ TAG % 2 ]
[ $MODULO2 -eq 0 ] && echo "gerade" || echo "ungerade"
oder wenn man willl auch als einzeiler:

Code: Select all

[ $[ `date +%e` % 2 ] -eq 0 ] && echo gerade || echo ungerade
"Email und Internet haben gemeinsam, dass sie beide in HTML geschrieben sind" (Peter Huth, TV-Computerexperte). Zitiert nach http://www.antihuth.de/

Post Reply