ubuntuusers.de

Shell-Skript zum Prüfen der Java-Version

Status: Gelöst | Ubuntu-Version: Kubuntu 8.10 (Intrepid Ibex)
Antworten |

schmittchen-schleicher

Anmeldungsdatum:
11. Dezember 2007

Beiträge: 49

Wohnort: Bonn

Ich versuche mich gerade am besagten Shell-Skript.

Erste Hürde habe ich gemeistert:

java -version

geht an stderr und nicht stdout, daher musste ich die Ausgabe umleiten.

Beim Finden der Stelle "64-Bit" komme ich aber nicht weiter und lande immer in der iX86-Ausgabe.

#!/bin/bash

# Die Ausgabe von java -version zeigt bei mir:
#
# java version "1.6.0_0"
# IcedTea6 1.3.1 (6b12-0ubuntu6) Runtime Environment (build 1.6.0_0-b12)
# OpenJDK 64-Bit Server VM (build 1.6.0_0-b12, mixed mode)


version=$(java -version 2>&1)

#echo "***"; echo $version; echo "***"

if [ "${version}" == ".*64-[bB]it.*" ]; then
	echo "64bit"
else
	echo "iX86"
fi

Ich finde den Fehler in der regEx nicht ...

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

ich würds ja mit grep lösen:

1
2
3
4
5
if java -version 2>&1 | grep -qi "64-bit"; then
  echo "64bit"
else
  echo "iX86"
fi

phst

Anmeldungsdatum:
24. Juni 2007

Beiträge: 527

schmittchen-schleicher schrieb:

Beim Finden der Stelle "64-Bit" komme ich aber nicht weiter und lande immer in der iX86-Ausgabe.

#!/bin/bash

# Die Ausgabe von java -version zeigt bei mir:
#
# java version "1.6.0_0"
# IcedTea6 1.3.1 (6b12-0ubuntu6) Runtime Environment (build 1.6.0_0-b12)
# OpenJDK 64-Bit Server VM (build 1.6.0_0-b12, mixed mode)


version=$(java -version 2>&1)

#echo "***"; echo $version; echo "***"

if [ "${version}" == ".*64-[bB]it.*" ]; then
	echo "64bit"
else
	echo "iX86"
fi

Ich finde den Fehler in der regEx nicht ...

Erstens kennt nicht der [-Befehl Musterüberprüfung, sondern nur der [[-Befehl. Zweitens kennt der [-Befehl keinen =-Operator. Drittens wird für die Musterüberprüfung ein Glob-Muster und kein regulärer Ausdruck verwendet. Viertens funktioniert das nur, wenn das Muster nicht gequotet ist. So ist’s richtig:

1
2
3
4
5
6
if [[ $version == *64-[bB]it* ]]
then
  echo 64bit
else
  echo iX86
fi

schmittchen-schleicher

(Themenstarter)

Anmeldungsdatum:
11. Dezember 2007

Beiträge: 49

Wohnort: Bonn

phst schrieb:

Erstens kennt nicht der [-Befehl Musterüberprüfung, sondern nur der [[-Befehl.

Ist das so? "Linux in a Nutshell" von O'Reilly nennt "keine Worttrennung und keine Pfadnamenexpansion" als Unterschied zwischen [ ] und [[ ]].

Ich habe [ ] in anderen Skripten mit Mustervergleich bereits verwendet

1
2
3
if [ "${1}" == "1" ]
then
  echo Option1

Zweitens kennt der [-Befehl keinen =-Operator.

Auch hier behauptet o.g. Buch gegenteiliges. Es wird lediglich der == Operator empfohlen.

Drittens wird für die Musterüberprüfung ein Glob-Muster und kein regulärer Ausdruck verwendet. Viertens funktioniert das nur, wenn das Muster nicht gequotet ist. So ist’s richtig:

Daran wird es gelegen haben! Danke!

Anscheinend ist ein weiterer Unterschied zwischen [ ] und [[ ]] die Verwendbarkeit von Platzhaltern in letzterer, denn mit [ ] klappt es nicht.

[EDIT]

Das hast du bei 1. ja auch gesagt... "Mustervergleich" im Sinne von Suchmuster/regEx und nicht im Sinne des == Operators ☺

[/EDIT]

phst

Anmeldungsdatum:
24. Juni 2007

Beiträge: 527

schmittchen-schleicher schrieb:

phst schrieb:

Erstens kennt nicht der [-Befehl Musterüberprüfung, sondern nur der [[-Befehl.

Ist das so? "Linux in a Nutshell" von O'Reilly nennt "keine Worttrennung und keine Pfadnamenexpansion" als Unterschied zwischen [ ] und [[ ]].

Das ist zwar richtig, aber unvollständig. Musterüberprüfungen gehen nicht, wie man leicht testen kann:

1
2
3
4
~$ [ auuua == *uuu* ] && echo ja || echo nein
nein
~$ [[ auuua == *uuu* ]] && echo ja || echo nein
ja

Hier wird *uuu* einfach zur Liste der Dateinamen, die auf dieses Muster passen, expandiert. Falls keine Dateinamen passen, wird der String unverändert gelassen. Ein Mustervergleich wird aber nicht durchgeführt.

Der wesentliche Unterschied liegt darin, dass [ ein Shellbefehl, [[ dagegen ein Schlüsselwort ist, für das eine andere Syntax gilt.

Ich habe [ ] in anderen Skripten mit Mustervergleich bereits verwendet

1
2
3
if [ "${1}" == "1" ]
then
  echo Option1

Das ist kein Mustervergleich.

Zweitens kennt der [-Befehl keinen =-Operator.

Auch hier behauptet o.g. Buch gegenteiliges. Es wird lediglich der == Operator empfohlen.

Ich hatte mich leider verschrieben. Der originale [-Befehl kennt keinen ==-Operator, dieser wurde von Bash als Erweiterung hinzugefügt.

1
2
3
4
5
6
~$ [ a == a ] && echo ja || echo nein
ja
~$ sh
$ [ a == a ] && echo ja || echo nein
[: 1: ==: unexpected operator
nein

schmittchen-schleicher

(Themenstarter)

Anmeldungsdatum:
11. Dezember 2007

Beiträge: 49

Wohnort: Bonn

Vielen Dank für die ausführlichen Infos!

Antworten |