if / then - 4 Variablen - Anfänger

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Quickly1971
Beiträge: 110
Registriert: 08.05.2009 15:26:32

if / then - 4 Variablen - Anfänger

Beitrag von Quickly1971 » 28.01.2018 13:47:52

Hallo.
Ich benötige mal wieder generelle Hilfe beim scripting.
Um es vorweg zu sagen: Ich habe mir gerade einige Seiten aufgerufen und arbeite sie durch. Ich befürchte jedoch, dass ich überfordert sein werden.

Ich möchte gerne Pakete auf Systemen installieren. Hier sind Debian 7.x, 8.x oder 9.x möglich.
Mit cat /etc/debian_version kann ich die Version auslesen und/oder auch in eine Datei ausgeben.
Soweit klar.

Die Variablen sind:
- wenn Debian 7.x -> dann Download XYZ-stretch_all.deb
- wenn Debian 8.x -> dann Download XYZ-jessie_all.deb
- wenn Debian 9.x -> dann Download XYZ-wheezy_all.deb
- wenn keiner der Werte ausgegeben, dann Script abbrechen.

Vielleicht kann ich Onkel Google sogar folgen und es nachvollziehen. Echt Bedenken habe ich jedoch wegen dem Wert bzgl. der Versionsnummern hinter dem Punkt. Ich schätze spätestens dort wird es enden.

Hoffe ich konnte mich verständlich ausdrücken.
Eine Hilfe für Anfänger wäre toll. Denn dann kann ich es ableiten für andere Variablen und muss nicht wieder nerven.

Vielen Dank, Lars
Der Mensch hat drei Wege, klug zu werden.
Erstens durch Nachdenken: Das ist der edelste.
Zweitens durch Nachahmen: Das ist der leichteste.
Drittens durch Erfahrung: Das ist der bitterste.

Quickly1971
Beiträge: 110
Registriert: 08.05.2009 15:26:32

Re: if / then - 4 Variablen - Anfänger

Beitrag von Quickly1971 » 28.01.2018 14:53:39

Es soll ja keiner sagen, dass ich mich nicht bemühe.
Ich glaube den erste Teil zu haben.

Nachdem mir bei der Versionsabfrage immer wieder der Wert Proxmox entgegengesprungen ist, geht es nun über diesen Weg erst mal einen klaren Fixpunkt zur Distribution zu bekommen.
Den Weg über die Datei finde ich dabei gar nicht schlecht.

Code: Alles auswählen

#!/bin/bash -e
#
# Version auslesen und durch eindeutigen Wert ersetzen
	cat /etc/*release 2>/dev/null | head -n1 > /tmp/version.txt
	sed -i "s/.*wheezy.*/wheezy/g" /tmp/version.txt
	sed -i "s/.*jessie.*/jessie/g" /tmp/version.txt
	sed -i "s/.*stretch.*/stretch/g" /tmp/version.txt
	sed -i "s/.*buster.*/buster/g" /tmp/version.txt

Version="`cat /tmp/version.txt`"
echo "$Version"
# I'll be back...
Zuletzt geändert von Quickly1971 am 28.01.2018 15:13:59, insgesamt 2-mal geändert.
Der Mensch hat drei Wege, klug zu werden.
Erstens durch Nachdenken: Das ist der edelste.
Zweitens durch Nachahmen: Das ist der leichteste.
Drittens durch Erfahrung: Das ist der bitterste.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: if / then - 4 Variablen - Anfänger

Beitrag von NAB » 28.01.2018 15:11:21

Ich mag ja ungerne deinen Ideenreichtum bremsen, aber denk mal hierrüber nach:

Code: Alles auswählen

$ TEST=$(cat /etc/*release | grep "VERSION_ID")
$ echo $TEST
VERSION_ID="9"
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

OppaErich
Beiträge: 323
Registriert: 13.04.2005 16:10:16
Wohnort: Essen

Re: if / then - 4 Variablen - Anfänger

Beitrag von OppaErich » 28.01.2018 15:17:37

Hmmm....

Code: Alles auswählen

oppa@oppa-hex-ssd:~$ TEST=$(cat /etc/*release | grep "VERSION_ID")
oppa@oppa-hex-ssd:~$ echo $TEST

oppa@oppa-hex-ssd:~$ 
OK, ist ein siduction.

Quickly1971
Beiträge: 110
Registriert: 08.05.2009 15:26:32

Re: if / then - 4 Variablen - Anfänger

Beitrag von Quickly1971 » 28.01.2018 15:21:41

Euch beiden erst mal vielen Dank. Soweit dann erst mal... mühsam nährt sich das Eichhörnchen... :facepalm: Dann versuche ich mich weiter mit den vermutlichen if - then Geschichten.

Um mein eigenes Ego ein klitze kleines bischen zu stärken... mein umständlicher Weg geht auch. Nur Euer weg ist natürlich eleganter und übersichtlicher.
Der Mensch hat drei Wege, klug zu werden.
Erstens durch Nachdenken: Das ist der edelste.
Zweitens durch Nachahmen: Das ist der leichteste.
Drittens durch Erfahrung: Das ist der bitterste.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: if / then - 4 Variablen - Anfänger

Beitrag von NAB » 28.01.2018 15:46:24

Man kann das noch verfeinern:

Code: Alles auswählen

$ TEST=$(cat /etc/*release | grep "VERSION_ID" | cut -d '"' -f 2)
$ echo $TEST
9
Ich weiß nur nicht, wie schlau das ist.

Der Hinweis von OppaErich ist gut. Ich hab nämlich keine Ahnung, wie man an /etc/os-release zuverlässig erkennt, ob es 1) ein Debian ist und 2) welche Version. Ich hab mich schon gewundert, warum du /etc/*release nimmst.

Noch ein Versuch:

Code: Alles auswählen

$ TEST=$(cat /etc/os-release | grep -i stretch)
$ echo $TEST
PRETTY_NAME="Debian GNU/Linux 9 (stretch)" VERSION="9 (stretch)"
Kennst du $?
Darin wird der Erfolg/Misserfolg des letzten Befehls gespeichert.

Code: Alles auswählen

$ cat /etc/os-release | grep -i "stretch" 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
VERSION="9 (stretch)"
$ TEST=$?
$ echo $TEST
0
$ cat /etc/os-release | grep -s "jessie" 
$ TEST=$?
$ echo $TEST
1
Edit: Tags heil gemacht
Zuletzt geändert von NAB am 28.01.2018 16:14:57, insgesamt 1-mal geändert.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

owl102

Re: if / then - 4 Variablen - Anfänger

Beitrag von owl102 » 28.01.2018 15:55:45

NAB hat geschrieben: ↑ zum Beitrag ↑
28.01.2018 15:46:24

Code: Alles auswählen

$ TEST=$(cat /etc/*release | grep "VERSION_ID" | cut -d '"' -f 2)
$ echo $TEST
9
Mein Gegenvorschlag wäre:

Code: Alles auswählen

. /etc/os-release
echo $VERSION_ID
Ich hab nämlich keine Ahnung, wie man an /etc/os-release zuverlässig erkennt, ob es 1) ein Debian ist

Code: Alles auswählen

. /etc/os-release
if [ "$ID" = "debian" ]; then
echo "Es ist ein Debian."
else
echo "Es ist eine Falle!"
fi

Quickly1971
Beiträge: 110
Registriert: 08.05.2009 15:26:32

Re: if / then - 4 Variablen - Anfänger

Beitrag von Quickly1971 » 28.01.2018 15:59:31

ob es 1) ein Debian ist und 2) welche Version.
Für mich ist zur Zeit nur Debian relevant. Alles andere verweigere ich. Hat auch einen ganz einfachen Grund. Wie man sehen kann fehlen mir wichtiges, grundlegendes Wissen bereits bei Debian. :?
Da fange ich nicht noch mit was anderem an. Ich setze hauptsächlich ProxMox, Univention und reines Debian ein.

Die Tip´s von Euch sind Gold wert gewesen! Hat geklappt. Das Endprodukt sieht wie folgt aus. Über weitere Hinweise bin ich natürlich immer offen und würde mich freuen!

Code: Alles auswählen

#!/bin/bash
#
# Version auslesen
Version=$(cat /etc/*release | grep "VERSION_ID")
echo "Die Version ist:" $Version

# Variable verarbeiten
case $Version in
	*7*)		echo "Und hier lasse ich die Software fuer Debian 7 installieren" ;;
	*8*)		echo "Und hier lasse ich die Software fuer Debian 8 installieren" ;;
	*9*)		echo "Und hier lasse ich die Software fuer Debian 9 installieren" ;;
	*10*)		echo "Und hier lasse ich die Software fuer Debian 10 installieren" ;;
	*)			echo "Schoener Mist, das war nix!" ;;
esac
exit
Der Mensch hat drei Wege, klug zu werden.
Erstens durch Nachdenken: Das ist der edelste.
Zweitens durch Nachahmen: Das ist der leichteste.
Drittens durch Erfahrung: Das ist der bitterste.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: if / then - 4 Variablen - Anfänger

Beitrag von NAB » 28.01.2018 16:03:09

Ich bin bei sowas ja pedantisch. Bei Debian 17 kriegst du ein Problem. Aber das ist ja noch etwas hin ...
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: if / then - 4 Variablen - Anfänger

Beitrag von MartinV » 28.01.2018 17:35:35

Vorschlag zur weiteren Optimierung:

Code: Alles auswählen

#! /bin/bash

source /etc/os-release  # Datei wird Teil des Skriptes, alle Variablen werden übernommen

echo "Betriebssystem: $PRETTY_NAME"

if [ "$ID" != "debian" ] ; then
  echo "Fehler: Kein debian"
  exit 1
fi 

case $VERSION_ID in
  7) Paketname="Paket_7" ;;
  8) Paketname="Paket_8" ;;
  9) Paketname="Paket_9" ;;
  10) Paketname="Paket_10" ;;
  *) 
    echo "Fehler: debian Version $VERSION_ID wird nicht unterstützt"
    exit 1 
  ;;
esac

echo "Installiere $Paketname"
# hier nur 1x Code zum Installieren

exit 0
Edit: Je nachdem, wie die Dateinamen Deiner gewünschten Downloads stukturiert sind, kann man vielleicht noch weiter verbessern und die case-Abfrage für verschiedene Versionen einsparen
Die Variablen sind:
- wenn Debian 7.x -> dann Download XYZ-stretch_all.deb
- wenn Debian 8.x -> dann Download XYZ-jessie_all.deb
- wenn Debian 9.x -> dann Download XYZ-wheezy_all.deb
- wenn keiner der Werte ausgegeben, dann Script abbrechen.

Code: Alles auswählen

#! /bin/bash

source /etc/os-release
[ "$ID" = "debian" ] || {
  echo "Fehler: Kein debian"
  exit 1
}

Debianversionsname=$(echo $VERSION | cut -d'(' -f2 | cut -d')' -f1)
Paketname="XYZ-${Debianversionsname}_all.deb"
Paketurl="http://blablub.de/$Paketname"
Paketdatei="/tmp/$Paketname"

echo "Installiere $Paketname auf $PRETTY_NAME"

wget $Paketurl -O $Paketdatei || {
  echo "Fehler beim Download von $Paketurl"
  exit 1
}

apt-get install -y $Paketdatei || {
  echo "Fehler beim Installieren von $Paketdatei"
  exit 1
}

echo "$Paketname erfolgreich installiert"
rm $Paketdatei
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Antworten