2017-05-15 1 views
1

Ich versuche, einen Test zu schreiben, um zu überprüfen, ob ein Benutzer vorhanden ist. Ich weiß, es ist die einfache getent, die ich später entdeckt, während mein Problem googeln (und die ich wahrscheinlich mit aufzuwickeln wird), aber ich bin jetzt interessiert dies als eine akademische Übung zu lösen.Bash Test der Funktion zurückgeben nicht funktioniert

Ich habe ein Skript, ein zweites Skript über den source Befehl zu laden und dann eine Funktion von der geladenen Skript ausführt. Das Ziel war, den Check auszuführen, ohne eine Subshell zu erzeugen.

Das Problem, das ich bin, ist die Überprüfung des Rückgabestatus innerhalb dieser aufgerufenen Funktion (es wird wiederum eine zweite Methode aufruft).

Mein Code. Anfängliche tst.sh Skript:

#!/bin/sh 
userName="$1" 
source userExists.sh 
exitIfUserExist "${userName}" 
exitIfUserNotExist "${userName}" 
exit 0 

userExists.sh:

#!/bin/sh 

#check if user exists already 
checkIfUserExists() 
{ 
    userName=$1 
    echo "userName: $userName" 

    while IFS= read -r line 
    do 
     # First, whack off everything after the username 
     userNameTmp=${line%:*:*:*:*:*:*} 
     echo "userNameTmp: $userNameTmp" 

     # Then compare the username to that entered by the user. 
     [[ $userNameTmp = "${userName}" ]] && return 0 
    done </etc/passwd 
    echo "Not found" 

    return 2 
} 

exitIfUserExist() 
{ 
    if checkIfUserExists $1 == 0 
    then 
     echo "Error: User ${userName} already exists" 
     exit 1 
    fi 
    echo "end exitIfUserExist" 
} 

exitIfUserNotExist() 
{ 
    checkIfUserExists $1;echo $? 
    if checkIfUserExists $1 > 0 
    then 
     echo "Error: User ${userName} does not exist" 
     exit 1 
    fi 
    echo "end exitIfUserNotExist" 
} 

Ausgabe von zwei Tests - zunächst mit einem Benutzernamen, der das zweite mit einer vorhanden ist, das nicht:

[[email protected]_host ~]# sh t.sh bob 
userName: bob 
userNameTmp: root 
userNameTmp: bin 
userNameTmp: daemon 
... 
userNameTmp: rpc 
userNameTmp: rpcuser 
userNameTmp: nfsnobody 
userNameTmp: bob 
Error: User bob already exists 


[[email protected]_host ~]# sh t.sh bobNOTTHERE 
userName: bobNOTTHERE 
userNameTmp: root 
userNameTmp: bin 
userNameTmp: daemon 
... 
userNameTmp: rpc 
userNameTmp: rpcuser 
userNameTmp: nfsnobody 
userNameTmp: bob 
Not found 
end exitIfUserExist 
userName: bobNOTTHERE 
userNameTmp: root 
userNameTmp: bin 
userNameTmp: daemon 
... 
userNameTmp: rpc 
userNameTmp: rpcuser 
userNameTmp: nfsnobody 
userNameTmp: bob 
Not found 
2 
end exitIfUserNotExist 

Wie zu sehen ist, funktioniert der erste Test, aber angesichts des zweiten Ergebnisses glaube ich nicht, dass der Test dann so funktioniert, wie ich es erwarte. Wie repariere ich die Tests in den "exitIf *" Funktionen, um richtig zu arbeiten?

+1

Entweder 'if checkIf UserExists $ 1' oder 'if ((checkIfUserExists $ 1 == 0))' – cdarke

+0

Das erste Formular funktioniert einwandfrei! Leider mir letzteres gibt: 'userExists.sh: Linie 37: ((: checkIfUserExists bobb = 0: "! Bobb = 0"! Syntaxfehler in Ausdruck (Fehler-Token)' – Jon

Antwort

0

Die if checkIfUserExists $1 == 0 Linie rufen nur checkIfUserExists mit 3 Parametern ($1, "==" und "0").

Wechseln zu: if checkIfUserExists $1

Die if Anweisung einfach überprüfen, ob der Befehl, die folgen 0

Sie auch if checkIfUserExists $1 > 0 zu if ! checkIfUserExists $1

+ ändern können: comparaison tun Sie eine verwenden müssen oder (( commands/keywords

+0

, die den Trick tat hatte ich zuvor versucht verschiedene Kombinationen von '[' und '[[' und ich glaube, ich habe versucht '((' '), aber ich hatte kein Leerzeichen zwischen dem Operator und meinem Befehl, wie cdarke im Kommentar zu meinem Post angegeben hat. – Jon