Probleme mit nem kleinen sh-Script; Zweizeiler zaubert eine Variable rein...

quarzsnoopy

[Free|Net]BSD - User
Hallo Leute!
Ich hab hier ein kleines Problem mit meinem Script.
Im grunde soll es die "/etc/mk.conf" einlesen, die "+"-Variablen zusammen fassen (und was sonst noch so mit den komischen "?"-Variablen zu tun ist), und dann alles sauber (eine Variable = eine Zeile) ausgeben.

Leider tritt aber schon nach dem einlesen der ersten zwei Variablen der Effekt auf, das die Ausgabe nicht aus zwei Zeilen/Variablen besteht, sondern aus drei??? :confused:

Kann mir das mal einer erklähren und eine Lösung vorschlagen, hier das Sript und die Ausgabe:


Script:
Code:
# $NetBSD: mk.conf,v 1.65 2005/06/08 14:42:47 markd Exp $
#

# A file providing defaults for pkgsrc and the packages collection.
# See the NetBSD mk.conf(5) and packages(7) manual page for a full
# description of all available options.
#

# ************************************************************************
# NOTE TO PEOPLE EDITING THIS FILE - USE LEADING SPACES, NOT LEADING TABS.
# ************************************************************************

ALLOW_VULNERABLE_PACKAGES=yes
# allow the user to build packages which are known to be vulnerable to
# security exploits
# Possible: defined, not defined
# Default: not defined

MANINSTALL?= maninstall catinstall
# Specify manpage installation types.


echo "ALLOW_VULNERABLE_PACKAGES=\"${ALLOW_VULNERABLE_PACKAGES}\"
MANINSTALL=\"${MANINSTALL}\""

Ausgabe:
Code:
MANINSTALL?=: not found
ALLOW_VULNERABLE_PACKAGES="yes"
MANINSTALL=""


Und so sollte es eigentlich aussehen:
Code:
ALLOW_VULNERABLE_PACKAGES="yes"
MANINSTALL="maninstall catinstall"
 
Was soll das Fragezeichen
Code:
MANINSTALL? = maninstall catinstall
Wohl ein typo, oder?

Besser etwa so
Code:
MANINSTALL="maninstall catinstall"

Gruß,

Ice
 
Ice schrieb:
Was soll das Fragezeichen
Code:
MANINSTALL? = maninstall catinstall
Wohl ein typo, oder?

Besser etwa so
Code:
MANINSTALL="maninstall catinstall"

Gruß,

Ice
Nein, das ist so schon richtig! Sieh Dir mal die "mk.conf" unter NetBSD an, die ersten beiden Variablen sehen dort so aus. Ich glaube das Fragezeichen bedeutet, das diese Werte nur dann gesetzt werden, wenn die Variable nicht schon einen Wert hat. Um den ursprünglichen Wert nicht bedin gungslos zu überschreiben, soll halt als Standardwert sein, um sicher zu stellen das die Variable in jedem Fall einen Wert hat aber nicht irgend einen... glaube ich.

In meinen eigenen Shellscripten mache ich das auch immer so wie Du es in zweiten CODE-Fenster zeigst, aber das ist von NetBSD so geschrieben worden und die haben einen Grund dafür.
 
Verstehe ich das jetzt richtig, dass Du dann die mk.conf selbst als Script ausführst??????

Gruß,

Ice
 
Ice schrieb:
Verstehe ich das jetzt richtig, dass Du dann die mk.conf selbst als Script ausführst??????

Gruß,

Ice
In diesem Testscript sind das nur zwei Variablen daraus. Die mk.conf besteht ja fast nur aus VARIABLEN und ist für einen derartigen Einsatz geschrieben worden. :D
 
Ich glaube, ich weiss was diese komiche Zeile bedeutet:
MANINSTALL?=: not found

Er kann diese Variable nicht einlesen, wie es eigentlich (nach meinem Verständnis) sein sollte.... :-(
 
quarzsnoopy schrieb:
Ich hab hier ein kleines Problem mit meinem Script.
Im grunde soll es die "/etc/mk.conf" einlesen, die "+"-Variablen zusammen fassen (und was sonst noch so mit den komischen "?"-Variablen zu tun ist), und dann alles sauber (eine Variable = eine Zeile) ausgeben.

Ich fuerchte, Du velwechserst gerade ganz heftig shake und mell.
 
kili schrieb:
Ich fuerchte, Du velwechserst gerade ganz heftig shake und mell.
Erlich gesagt, hab ich keine Ahnung davon.
Das, was ich dort geschrieben habe, hab ich auch nur aufgeschnappt.... brauchte ich bis jetzt nicht....
:cool:

Aber Du scheinst da den besseren Durchblick zu haben, bitte erklär mir doch mal die Hintergründe. :)
 
kili schrieb:
Ich fuerchte, Du velwechserst gerade ganz heftig shake und mell.
Ich hab da was gefunden: man sh
Code:
     ${parameter:?[word]}  Indicate Error if Null or Unset.  If parameter is
                           unset or null, the expansion of word (or a message
                           indicating it is unset if word is omitted) is writ-
                           ten to standard error and the shell exits with a
                           nonzero exit status.  Otherwise, the value of
                           parameter is substituted.  An interactive shell
                           need not exit.

     ${parameter:+word}    Use Alternative Value.  If parameter is unset or
                           null, null is substituted; otherwise, the expansion
                           of word is substituted.
Ist es das?


Was muss ich denn nun machen, damit das Script auch mit diesen Variablen umgehen kann?
Wenn erst bei der Ausgabe ein Fehler kommen würde, könnte ich ja noch was drehen... aber so? Schon beim einlesen? Da weiss ich nicht weiter! :confused: :grumble:

Kannst Du mir dabei helfen?
 
@quarzsnoopy

Also der Hinweis "shake und mell" soll Dir sagen, dass es ein Unterschied ist, ob eine config-Datei wie die mk.conf von
a) make
oder
b) einer shell (/bin/sh)
ausgelesen wird.

Gruß,

Ice
 
Makefiles parst man mit make(1), nicht mit sh(1)! Vielleicht hilft dir sowas hier weiter:
Code:
make -ndv -f /etc/make.conf 2>&1 | egrep "^Global:" | uniq
 
MrFixit schrieb:
Makefiles parst man mit make(1), nicht mit sh(1)! Vielleicht hilft dir sowas hier weiter:
Code:
make -ndv -f /etc/make.conf 2>&1 | egrep "^Global:" | uniq
Danke!
Genau das ist es, mit der Ausgabe ist mein komplettes Script auf eine Kommandozeile reduziert... :D
 
Zurück
Oben