View previous topic :: View next topic |
Author |
Message |
musv Advocate
Joined: 01 Dec 2002 Posts: 3337 Location: de
|
Posted: Fri Jul 31, 2015 5:22 am Post subject: Bash: gesetztes Bit testen |
|
|
Guten Morgen,
ich bastel mir grad ein Wakeup-Script für meinen HTPC. VDR nutzt für den Aufnahmestatus eine Bitmaske:
1 - Timer ist aktiviert / deaktiviert
2 - Direktaufnahme (Record auf der Fernbedienung gedrückt)
4 - VPS
8 - VDR nimmt grad was auf.
Das geplante Script wird beim Runterfahren des Rechners ausgeführt. D.h. ich muss in der Bitmaske testen, ob Bit 1 gesetzt, Bit 2 und 8 nicht gesetzt sind. Die 4 ist egal.
Ausgeben kann man das auf die Art:
würde eine 1 ausgeben, da ja bekanntermaßen die 8 in der 9 drinsteckt.
Mein bisheriger Versuch:
Code: |
#!/bin/bash
is_active_timer()
{
[ $(($1 & 0x1)) == 1 ] || return 1
[ $(($1 & 0x2)) == 0 ] || return 1
[ $(($1 & 0x8)) == 0 ] || return 1
return 0
}
# main
while read TIMERS; do
IFS=":"
set -- $TIMERS
echo "${1}"
if is_active_timer "${1}" ; then
echo "ja"
else
echo "nein"
fi
unset IFS
done < cat timers.conf |
In meiner Funktion ist aber noch der Wurm drin. Hab da schon verschiedene Varianten durchgespielt, aber nur die erste Zeile klappt, d.h. Test auf das 1. Bit (von rechts).
Wie krieg ich das am elegantesten gebacken? |
|
Back to top |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6747
|
Posted: Fri Jul 31, 2015 3:37 pm Post subject: Re: Bash: gesetztes Bit testen |
|
|
Das darf man nicht: Dadurch verliert IFS seine spezielle Bedeutung. |
|
Back to top |
|
|
mastacloak Apprentice
Joined: 01 Aug 2004 Posts: 174 Location: Berlin / Germany
|
Posted: Fri Aug 14, 2015 11:34 pm Post subject: Re: Bash: gesetztes Bit testen |
|
|
musv wrote: |
In meiner Funktion ist aber noch der Wurm drin. Hab da schon verschiedene Varianten durchgespielt, aber nur die erste Zeile klappt, d.h. Test auf das 1. Bit (von rechts).
Wie krieg ich das am elegantesten gebacken? |
Was genau funktioniert denn nicht? Bei 1 (nur Bit 1 gesetzt 2^0=1) und 5 (Bit 1 und Bit 3 gesetzt 2^0+2^2=5), gibt deine Funktion als exit status 0 zurück, sonst 1.
Das ist doch laut deiner Beschreibung das was du wolltest, oder?
Hast du in deiner Beschreibung die Bitposition oder den Wert der Bitmaske angegeben?
Wenn du tatsächlich Bit 8 extrahieren wolltest, dann müsstest du mit 0x80 (dezimal 128) maskieren.
0x8 ist Bit 4.
Die Funktion is_active_timer() ist etwas umständlich und ineffizient. Sie ließe sich zusammenschrumpfen auf
Code: | is_active_timer() { ((($1 & 0xB) == 1)); } |
aber es ging dir ja nicht unbedingt um Effizienz. |
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3922 Location: Hamburg
|
Posted: Sat Aug 15, 2015 1:03 pm Post subject: Re: Bash: gesetztes Bit testen |
|
|
musv wrote: |
würde eine 1 ausgeben, da ja bekanntermaßen die 8 in der 9 drinsteckt.
|
Code: | # echo $((9 & 8))
8
| die 7, die steckt da auch noch drin usw !
|
|
Back to top |
|
|
musv Advocate
Joined: 01 Dec 2002 Posts: 3337 Location: de
|
Posted: Sat Aug 15, 2015 2:23 pm Post subject: Re: Bash: gesetztes Bit testen |
|
|
toralf wrote: | die 7, die steckt da auch noch [in der 9] drin usw !
|
Nee, tut sie nicht.
Um das Forum aber mal an meinen weiteren Erkenntnissen teilhaben zu lassen:
Der Rückgabewert ist bei den Abfragen der Bits nicht, wie ich fälschlicherweise angenommen hab, immer 1 sondern entspricht dem zu prüfenden Bit. Also
Meine Funktion hab ich dann so gebastelt:
Code: | is_active_timer()
{
[[ $(echo $(($1 & 1))) == 1 ]] || return 1
[[ $(echo $(($1 & 2))) -gt 0 ]] && return 1
[[ $(echo $(($1 & 8))) -gt 0 ]] && return 1
return 0
} |
|
|
Back to top |
|
|
toralf Developer
Joined: 01 Feb 2004 Posts: 3922 Location: Hamburg
|
Posted: Sat Aug 15, 2015 3:51 pm Post subject: Re: Bash: gesetztes Bit testen |
|
|
musv wrote: | toralf wrote: | die 7, die steckt da auch noch [in der 9] drin usw !
|
Nee, tut sie nicht. | *prust* - da kam ich mit meiner Schadenfreude ja nicht weit - ich werd' mal wieder Binärdarstellung üben müssen. |
|
Back to top |
|
|
|