staging.inyokaproject.org

Rechnen im Script

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 18.04 (Bionic Beaver)
Antworten |

werner-fred

Anmeldungsdatum:
13. Mai 2013

Beiträge: 175

Hallo, bitte nicht amüsieren, über mein vermutlich naive Frage.

Ich will mit u.g. Script ab einem bestimmten Datum (hier Dez.2019) etwas machen lassen. Aktuell y=19m=11 ist 1911 also -1 von 1912.

#!/bin/sh
set datum
set ende
set zahl

ende=1912
datum=$(date +%y%m)
zahl=$(($datum - $ende))

if $zahl <= 0;   then
        echo Noch kein Ende
    else
        echo Ende erreicht
fi

exit 0

Script "meckert" mir 'fi' an? Und springt auch immer zu 'else', auch wenn ich z.B. ende=1910 setze. Ist Zahl hier nicht '⇐' als Zahl?

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21863

Du rechnest nicht, du vergleichst (wichtiger Unterschied). Noch dazu ist die Syntax tatsächlich nicht ⇐

Schau mal in Shell/Bash-Skripting-Guide für Anfänger (Abschnitt „If-Else-Anweisung“) oder in https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php um mal zwei Beispiele rauszukramen 😉

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

redknight schrieb:

Du rechnest nicht, du vergleichst (wichtiger Unterschied). Noch dazu ist die Syntax tatsächlich nicht ⇐

Ich glaube tatsächlich, es ist nicht mal ein Vergleich und die Shell parst das "⇐ 0" als Eingabeumleitung aus der Datei mit Namen "=":

1
2
$ wc <= 0
bash: =: No such file or directory

Gewollt war

1
2
3
4
5
if [ $zahl -le 0 ];   then
        echo Noch kein Ende
    else
        echo Ende erreicht
fi

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: Zähle...

Willst Du nicht einfach an den Anfang deines Skripts so etwas packen?

[[ $(date +%y%m) -lt 1912 ]] && exit 0;

So wird es einfach beendet, falls es vor dem Dezember 2019 ist...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Rechnen im Script mit doppelten runden Klammern:

1
(( $(date +%y%m) <= 1910 )) && echo 0

Zu Testzwecken echo 0, nicht exit 0 - sonst schießt man sich die Shell weg. ☺

Du benutzt aber /bin/sh, nicht /bin/bash - hat das einen Grund oder nur so? Mit sh kann man die Doppelrundklammern nämlich nicht nutzen.

1
2
3
4
#!/bin/sh
set datum
set ende
set zahl

Diese set-Befehle - haben die einen bestimmten Effekt?

1
2
3
ende=1912
datum=$(date +%y%m)
zahl=$(($datum - $ende))

3 Variablendeklarationen - alle werden nur einmal gebraucht.

1
exit 0

Das ist absolut überflüssig. Am Ende des Skriptes hat es keine Wahl, als sich zu beenden, außer Du sourcet es, dann reißt es Dir die Shell weg. Und 0 gibt es von selbst zurück, außer der letzte Befehl hat einen Fehlercode zurückgegeben - dann gäbe es den zurück - was meistens hilfreich ist.

shellcheck dezembertest.sh meldet für Dein Script übrigens:

1
2
3
zahl=$(($datum - $ende))
        ^-- SC2004: $/${} is unnecessary on arithmetic variables.
                 ^-- SC2004: $/${} is unnecessary on arithmetic variables.

So ginge es auch - nahe an Deinem Script:

1
2
3
4
5
6
7
#!/bin/bash
if (( $(date +%y%m) - 1912 <= 0 ))
then
    echo Noch kein Ende
else
    echo Ende erreicht
fi

aber a-b<=0 kann man auch als a<=b schreiben, oder? #!/bin/bash if [1] then echo Noch kein Ende else echo Ende erreicht fi }}} Kürzer ist aber

1
(( $(date +%y%m) <= 1912 )) && echo Noch kein Ende || echo Ende erreicht
  • 1: $(date +%y%m) ⇐ 1912

werner-fred

(Themenstarter)

Anmeldungsdatum:
13. Mai 2013

Beiträge: 175

Danke für die vielen Hinweise, die ich erst einmal "verdauen" muss.

Ich hatte gestern beim TV-Sehen etwas experimentiert, und folgendes Skript erstellt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
clear
d=$(date +%y%m)
v0=1908
v1=1910
v2=1911
v3=1912

if [ $d -gt $v0 ]
    then
        echo "ist 1908"     # Ist wahr
    else
        echo "fehler"
fi


if [ $d -gt $v1 ]
    then
        echo "ist 1910"     # Ist wahr
else
        echo "fehler"

fi

if [ $d -gt $v2 ]
    then
        echo "ist 1911"
else
        echo "fehler"       # Ist Falsch
fi

if [ $d -gt $v3 ]
    then
        echo "ist 1912"
else
        echo "fehler"       # Ist Falsch
fi

Ich muss zugeben, so 100% habe ich "if [ $d -gt $v0 ]" nicht verstanden, aber es scheint zu funktionieren.

user_unknown schrieb:

Rechnen im Script mit doppelten runden Klammern:

Du benutzt aber /bin/sh, nicht /bin/bash - hat das einen Grund oder nur so? Mit sh kann man die Doppelrundklammern nämlich nicht nutzen. Diese set-Befehle - haben die einen bestimmten Effekt?

Hat keinen Grund, hatte auch gestern mit /bin/bash experimentiert, Script soll auf eine Enigma2-Box mal laufen. Und Set hatte ich mal nur eingefügt, weil ich hier den Grund für die Problem vermutet hatte. Habe vor einigen Jahren mal mit c++ gearbeitet. Und exit 0 habe ich eingefügt, soll in /etc/rcS.d (verlinkt aus (etc/init.d/meine) laufen.

Wie schätzt ihr meinen o.g. Ansatz"if [ $d -gt $v0 ]" ein? Die vielen if-Anweisungen sind nur zum Testen, was wie geht.

Danke, Fred

Nachtrag: Mist, unter Ubuntu hat mein Testscript prima funktioniert. Die ersten zwei if-Anweisungen gehen zu "then" also Wahr und die anderen zwei if-Anweisungen gehen zu "else" also Falsch. Prima dachte ich.

Aber unter Linux-Enigma2 gehen alle 4 if-Anweisungen zu "then", als Wahr?? Nun will ich mal die vielen Vorschläge genauer analysieren.

Bearbeitet von rklm:

Syntaxhighlighting. Bitte beachte Forum/Syntax!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Du stehst kurz vor der Entdeckung der Prozedur und des Arrays. Nummerierte Suffixe sind ein deutliches Indiz:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
d=$(date +%y%m)
vs=(1908, 1910, 1911, 1912)

for v in ${vs[@]}
do
  if [ $d -gt $v ]
    then
        echo "$d ist > $v"     # Ist wahr
    else
        echo "fehler: $d <= $v"
  fi
done

Man vermeidet Codewiederholungen, weil man dann jede Änderung 4x vornehmen muss, der Leser muss 3,5x soviel Code lesen, es passt viel weniger Code auf den Bildschirm, ...

werner-fred

(Themenstarter)

Anmeldungsdatum:
13. Mai 2013

Beiträge: 175

Ich setze auf gelöst. Mein obiger Nachtrag von heute 13:39 / 14:57 Uhr ist Quatsch.

Script kann nicht beim Start sofort funktionieren, weil zu dem Zeipunkt Datum noch auf Jahr 1900 steht. Daran habe ich nicht gleich gedacht. Wenn aktuelles Datum stimmt, funktioniert es ja nun.

Noch einmal vielen Dank für die vielen Hinweise.

Gruss Fred

Finale Anmerkung: Funktioniert prima!!!!

Antworten |