• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Phänomen mit "test -n"

regexer

Advanced Hacker
Hallo zusammen!

Wieder einmal etwas komisches. Normalerweise müsste doch laut man-pages "test -n" genau das Gegenteil von "test -z" sein. Nach meinen Tests ist das aber nicht so. Für -z ist ein Leerstring und keine Parameterübergabe dasselbe. Für -n offensichtlich nicht:

Code:
~> test -z ""
~> echo $?
0
~> test -z
~> echo $?
0
~> test -n ""
~> echo $?
1
~> test -n
~> echo $?
0

Oder habe ich einen Denkfehler?

Gruß,

notoxp
 
Ich schätze mal dein Aufruf ist ein nicht gemeldeter "Syntaxfehler". -n und -z müssen immer einen Parameter haben.
Andere Unix machen das auch so.
Durch diesen fehlenden Fehler kann man mit der bash "schlampiger" arbeiten. Auf Sun und Tru64 habe ich unten "ksh" genutzt.

Wichtig ist es, das man den Parameter, hier a, immer mit "" einpackt.
Sonst gibt es Probleme mit leeren Parametern

Haveaniceday

dec-unix=>test -n
ksh: test: argument expected
dec-unix=>test -z
ksh: test: argument expected

Inhalt Shellskript yy schrieb:
set -x
a=""
test -z $a
echo $?
a=""
test -z "$a"
echo $?

linux schrieb:
++ a=
++ test -z
++ echo 0
0
++ a=
++ test -z ''
++ echo 0
0

tru64 schrieb:
+ a=
+ test -z
./yy[5]: test: argument expected
+ echo 1
1
+ a=
+ test -z
+ echo 0
0

Sun OS schrieb:
+ a=
+ test -z
./yy[5]: test: argument expected
+ echo 2
2
+ a=
+ test -z
+ echo 0
0
 
OP
regexer

regexer

Advanced Hacker
haveaniceday schrieb:
-n und -z müssen immer einen Parameter haben.
Interessant ist, dass das geschilderte Problem von einem Kollegen stammt, dem ich genau das auch erzählt habe. Es ist aber nicht so ...
Andere Unix machen das auch so.
Durch diesen fehlenden Fehler kann man mit der bash "schlampiger" arbeiten. Auf Sun und Tru64 habe ich unten "ksh" genutzt.
Danke für deine Tests. Ich habe die bash und die ksh unter linux und die ksh unter SCO Unixware probiert. Alle zeigen das gleiche Bild. Wenn das nicht der Beweis von SCO-Code in Linux ist ;-)
Wichtig ist es, das man den Parameter, hier a, immer mit "" einpackt. Sonst gibt es Probleme mit leeren Parametern
Das trifft auf test -f, -eq usw. zu. Bei -z und -n kann es auf keinen Fall schaden...

Im Übrigen ist [[ -z ]] bei der Angabe von Parameter restriktiver!

Hat noch jemand ein *BSD zu bieten?
 
A

Anonymous

Gast
Andere Unix machen das auch so.
Durch diesen fehlenden Fehler kann man mit der bash "schlampiger" arbeiten.

habe mal ein Reliant UNIX und HP-UX versucht dort ist der fehlende Parameter in jeder Shell und auch mit /usr/bin/test angemeckert worden.

Auf Solaris habe ich ksh sh csh jsh pfcsh pfksh pfsh tcsh zsh bash und auch /usr/bin/test versucht. und siehe da neben der bash hatt auch die zsh der fehlenden Parameter nicht gestört.

unter LINUX haben alle probierten Shells und auch /usr/bin/test auf den fehlenden Parameter nicht reagiert.

Jetzt stellt sich mir langsam doch die Frage, wer hat hier wohl vom wem Teile des Quelltextes abgeschrieben.

robi
 
A

Anonymous

Gast
notoxp schrieb:
Ist bei deinen UNIXen "test" auch ein shell builtin?

wenn ich dem Kommando type vertrauen kann, sollte ist das in jeder Shell eingebaut sein, habe jetzt mal ca 15 Shells auf unterschiedlichen Systemen getestet.

robi
 
OP
regexer

regexer

Advanced Hacker
robi schrieb:
wenn ich dem Kommando type vertrauen kann, sollte ist das in jeder Shell eingebaut sein, habe jetzt mal ca 15 Shells auf unterschiedlichen Systemen getestet.
Danke! Ich verursache ziemlichen Aufwand. Beruflich und privat habe ich mit SuSE-Linux verschiedener Versionen und SCO Unixware zu tun. Privat kommt vielleicht in nächster Zeit FreeBSD oder OpenBSD dazu.

Immer wieder stelle ich fest, dass es ziemlich schwierig sein kann, "universal" zu scriptieren. Schon SCO <--> Linux verhalten sich manchmal unterschiedlich...
 
Bei mir sollte alles über "build in test" gelaufen sein.
Skripting ist schon so eine Sache. Ich nutze in der Regel "ksh".
Bash ist bei manchen UNIX nicht als Standart mit drin.

Die Shell ist aber noch "harmlos". Noch schlimmer wird es mit awk, grep, etc.
bei Sun, HPUX und Tru64.

Es lohnt sich immer über ein Konzept mit Einbeziehung und Installation von
den GNU-Tools nachzudenken.

Beliebter "Ärger" bei mir: /usr/bin/awk auf Sun, /usr/xpg4/bin/awk geht. grep bei Sun,
awk mit der Grenze "199 Felder" bei HPUX,...

Haveaniceday
 
Oben