Forum: PC-Programmierung aus c Programm ein Bash Script machen


von Martin (Gast)


Lesenswert?

Hallo zusammen, ich bin ein Newbi in Sachen bash Scripte...Da ich ein C 
Programm in ein Bash Script umwandeln muss wollte ich fragen ob ich 
eionen Fehler gemacht habe? Oder es Verbesserungen im Syntax gibt?
1
#!/bin/bash second=i2cget -y 1 0x51 0x03 minute=i2cget -y 1 0x51 0x04 hour=i2cget -y 1 0x51 0x05 #Uhrzeit berechnen BCD kodiert second_calc= ((($second&0x70)>>4)*10)+ ($second&0x0F) minute_calc= ((($second&0x70)>>4)*10)+ ($second&0x0F) hour_calc=((($second&0x70)>>4)*10)+ ($second&0x0F) uhrzeit="${hour_calc}:${minute_calc}:${second_calc}" #Uhrzeit ausgeben echo $uhrzeit
2
3
#Alarm Uhrzeit (+5 Sekunden) berechnen BCD kodieren second_alert=(((($second_calc)/10<<4)| (($second_calc+5)%10))|0x7F minute_alert=(((minute/10)<<4)| (minute%10))#|0x08 hour_alert=(((hour/10)<<4)| (hour%10))#|0x08 #Alarm Uhrzeit einstellen i2cset -y 1 0x51 0x0A $second_alert i2cset -y 1 0x51 0x0B $minute_alert i2cset -y 1 0x51 0x0C $hour_alert ctl2=i2cget -y 1 0x51 0x01 ctl2_calc=(($ctl2/8)<<4)| ($ctl2%8))&0xEF i2cset -y 1 0x51 0x01 $ctl2_calc #Alarm ausgelöst überprüfen ctl2_new=i2cget -y 1 0x51 0x01 alarm=$ctl2_new&0x10
4
5
echo $alarm
 Danke

: Verschoben durch User
von Tux (Gast)


Lesenswert?

Würdest du dir die Mühe machen Zeilenumbrüche einzufügen würde sich 
vielleicht auch jemand anderes die Mühe machen das durch zu lesen...

von Sam P. (Gast)


Lesenswert?

Da ist leider so viel falsch, ich weiss gar nicht wo ich anfangen 
soll...

Zuerst: Die Shebang-Zeile kann nur einen Kommandozeilenparameter 
beinhalten. Was zum Henker machst du da?

Und als zweiten Tipp: In Bash kann man nicht so ohne weiteres rechnen. 
Integer-Arithmetik gibts per $(( ... )), aber auch da gibt es 
Einschränkungen.

Bash ist eine denkbar schlechte general-purpose Skriptsprache. Wenn du 
dich damit nicht auskennst, hättest du keine schlechtere Wahl treffen 
können. Je nachdem was du erreichen willst nimm Perl (wenn ein Rechner 
Bash hat, wird er mit an Sicherheit grenzender Wahrscheinlichkeit auch 
Perl haben), oder awk, oder bleib bei C.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Sam P. schrieb:
> Bash ist eine denkbar schlechte general-purpose Skriptsprache.

naja, so ungeeignet ist es nun auch wieder nicht. Hier eine Variante des 
Auslesens eines RTC (PCF8385), die zusätzlich noch sed benötigt:

http://bralug.de/wiki/BLIT2008-Board_mit_i2c-tiny-usb-Firmware#RTC_auslesen

Grüße Uwe

von Martin (Gast)


Lesenswert?

sorry das ist beim umkopieren schief gelaufen
1
#!/bin/bash 
2
second=i2cget -y 1 0x51 0x03 
3
minute=i2cget -y 1 0x51 0x04 
4
hour=i2cget -y 1 0x51 0x05 
5
6
#Uhrzeit berechnen BCD kodiert 
7
decond_calc= ((($second&0x70)>>4)*10)+ ($second&0x0F) 
8
minute_calc= ((($second&0x70)>>4)*10)+ ($second&0x0F) 
9
hour_calc=((($second&0x70)>>4)*10)+ ($second&0x0F) 
10
11
uhrzeit="${hour_calc}:${minute_calc}:${second_calc}" #
12
#Uhrzeit ausgeben 
13
echo $uhrzeit
14
15
#Alarm Uhrzeit (+5 Sekunden) berechnen BCD kodieren 
16
second_alert=(((($second_calc)/10<<4)| (($second_calc+5)%10))|0x7F 
17
minute_alert=(((minute/10)<<4)| (minute%10))#|0x08 
18
hour_alert=(((hour/10)<<4)| (hour%10))#|0x08
19
 #Alarm Uhrzeit einstellen 
20
i2cset -y 1 0x51 0x0A $second_alert 
21
i2cset -y 1 0x51 0x0B $minute_alert 
22
i2cset -y 1 0x51 0x0C $hour_alert 
23
ctl2=i2cget -y 1 0x51 0x01
24
 ctl2_calc=(($ctl2/8)<<4)| ($ctl2%8))&0xEF 
25
i2cset -y 1 0x51 0x01 $ctl2_calc 
26
#Alarm ausgelöst überprüfen 
27
ctl2_new=i2cget -y 1 0x51 0x01 
28
alarm=$ctl2_new&0x10
29
30
echo $alarm

von Norbert (Gast)


Lesenswert?

Martin,

du sitzt wahrscheinlich an einem Linux Rechner.
1
$  man bash

gibt dir eine detaillierte Anleitung zur Benutzung der b a-shell.

Vorweg:
1) Rechnen geht prima (Ganzzahlen)
1
let a=15        ; echo $a
2
let b=5         ; echo $b
3
let c=a+b       ; echo $c
4
let d=a-b       ; echo $d
5
let e=a*b       ; echo $e
6
let f=a/b       ; echo $f
7
let a*=2        ; echo $a
8
let a/=5        ; echo $a
9
let a+=14       ; echo $a
Shift muß allerdings in entsprechende Multiplikation oder Division 
umgesetzt werden.


2) Wenn du die (Zahlen)-Ausgabe eines Programms in eine Variable 
schreiben möchtest:
1
let second=`i2cget -y 1 0x51 0x03`

oder
1
let second=$(i2cget -y 1 0x51 0x03)

von Norbert (Gast)


Lesenswert?

> Shift muß allerdings in entsprechende Multiplikation oder Division
> umgesetzt werden.

Da muss ich mir mal widersprechen, wenn es sonst niemand macht ;-)
1
let a=5
2
let b=7
3
let b++
4
let "c = (++a << 2) + ++b"
5
echo $c

Ausgabe: 33

von Norbert (Gast)


Lesenswert?

...und hier ist der mögliche Zahlenbereich
auf einem Debian GNU/Linux amd64...
1
#!/bin/bash
2
let x=9
3
for((i=0;i<20;i++)); do
4
    let y=x+2
5
    echo "$x + 2 = $y"
6
    let x*=10
7
    let x+=9
8
done

Ausgabe:
9 + 2 = 11
99 + 2 = 101
999 + 2 = 1001
9999 + 2 = 10001
99999 + 2 = 100001
999999 + 2 = 1000001
9999999 + 2 = 10000001
99999999 + 2 = 100000001
999999999 + 2 = 1000000001
9999999999 + 2 = 10000000001
99999999999 + 2 = 100000000001
999999999999 + 2 = 1000000000001
9999999999999 + 2 = 10000000000001
99999999999999 + 2 = 100000000000001
999999999999999 + 2 = 1000000000000001
9999999999999999 + 2 = 10000000000000001
99999999999999999 + 2 = 100000000000000001
999999999999999999 + 2 = 1000000000000000001
-8446744073709551617 + 2 = -8446744073709551615
7766279631452241919 + 2 = 7766279631452241921

von Klaus W. (mfgkw)


Lesenswert?

der geradlinige Weg, C in ein Skript zu verwandeln, wäre etwa:
1
#!/bin/bash
2
3
TMPC=/tmp/meinc.c
4
5
cat >$TMPC <<EOF
6
#include <stdio.h>
7
int main( int nArgs, char**args )
8
{
9
    puts( "Hallo" );
10
    return 0;
11
}
12
EOF
13
14
gcc -Wall $TMPC -o $TMPC.$PID.out >/dev/null 2>&1
15
$TMPC.$PID.out
16
rm $TMPC.$PID.out

Das C-Programm kann man natürlich durch ein anderes ersetzen :-)

von Tobi (Gast)


Lesenswert?

Sehr schön Klaus :-)

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

let benutzt so gut wie niemand.

Hier mal Auszug aus nem Script das bei mir täglich läuft, auch ohne let:
1
#! /bin/bash
2
3
IPTABLES=/usr/sbin/iptables
4
echo $IPTABLES
5
6
# special ports
7
8
p_high="1024:65535"
9
p_ssh="1000:1023"
10
11
DSL_STATUS=`cat /tmp/dsl-check.tmp`
12
13
echo $DSL_STATUS

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?


von Norbert (Gast)


Lesenswert?

Nils S. schrieb:
> let benutzt so gut wie niemand.

Da schau' her!  <Loriot> Ach! </Loriot>

> Hier mal Auszug aus nem Script das bei mir täglich läuft, auch ohne let:
...

Es ging hier aber primär um Rechenvorgänge:
1
a=5
2
b=7
3
c=a+b       ; echo $c   # Ausgabe a+b
4
c=$a+$b     ; echo $c   # Ausgabe 5+7
5
let c=a+b   ; echo $c   # Ausgabe 12

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Dann halt

ERGEBNIS=$((5+4))

von Norbert (Gast)


Lesenswert?

Interessant, wie würdest du den Rechenvorgang:
1
let a=5
2
let b=7
3
let b++
4
let "c = (++a << 2) + ++b"
5
echo "Ergebnis: $c"
Ergebnis: 33

als compound command umformen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.