2016-09-27 8 views
0

Ich versuche, eine Benutzereingabe, bis die Eingabe/Namen Schleife zu bekommen, ist einzigartig (nicht in der Ausgabe/Variablen enthalten).Bash Benutzereingabe während nicht variable Schleife passen

Ich habe versucht, so etwas zu tun, was ich dachte, würde gearbeitet haben:

read -p "$QlabelName" input 
while [[ "$input" == "$(/usr/sbin/networksetup -listallnetworkservices |grep "$input")" ]]; do 
read -p "Name already in use, please enter a unique name:" input 
done 

Ich habe auch die $(/usr/sbin/networksetup -listallnetworkservices |grep "$input") Bit in eine Variable selbst versucht setzen und dann mit der Bedingung [[ "$input" == "GREPVARIABLE" ]] ohne Erfolg.

Original-Benutzereingabe-Menü, ohne Schleife (in Betrieb):

labelName=NJDC 
QlabelName=$(echo Please enter the name of connection to be displayed from within the GUI [$labelName]:) 
read -p "$QlabelName" input 
labelName="${input:-$labelName}" 
echo "The connection name will be set to: '$labelName'" 

ich eine Vielzahl von Lösungen von SO versucht habe, Unix, ServerFault usw. ohne Erfolg. Ich habe versucht, if, while, until, !=, ==, =~ auch ohne Erfolg.

ich mit einfachen Debug echo ‚s bei jedem Schritt bestätigt haben, die Variablen, die Daten enthalten, aber die Schleife nicht funktioniert.

EDIT (Lösung, in Zusammenhang mit der Frage, dank @ LinuxDisciple Antwort):

labelName=NJDC 
QlabelName=$(echo Please enter the name of connection to be displayed from within the GUI [$labelName]:) 
read -p "$QlabelName" input 
while /usr/sbin/networksetup -listallnetworkservices |grep -q "^${input}$"; do 
    read -p "Name already in use, please enter a unique name:" input 
done 
labelName="${input:-$labelName}" 
echo "The connection name will be set to: '$labelName'" 

Das war mir wichtig, die richtigen Informationen für labelName und Ausgangsstandardvariablenwerte zu halten, um den Benutzer .

+0

Ich habe versucht, nur eine vereinfachte Version der Schleife (eine Katze Befehl statt der Verwendung networksetup-Befehl) und es hat wie erwartet funktioniert. Bitte posten Sie Ihre Eingabe, erwartete Ergebnisse und tatsächliche Ergebnisse. –

+0

@JEarls Hmm, ich habe auch versucht, den Befehl/grep in eine Variable zu 'kattern'. Können Sie teilen, wie Sie es gemacht haben? – TryTryAgain

+0

"echo" ist keine gute Möglichkeit, dieses Problem zu beheben, da Sie nicht erkennen können, ob die Variable nachgestellte Leerzeichen oder Steuerzeichen aufweist, die sich auf die Übereinstimmung auswirken. Sie können 'printf '% q \ n'" $ variable "' verwenden, um eine eindeutige Darstellung zu sehen. –

Antwort

1
read -p "$QlabelName" input 
while /usr/sbin/networksetup -listallnetworkservices |grep -q "^${input}$"; do 
    read -p "Name already in use, please enter a unique name:" input 
done 

grep ‚s Return-Code ist gut genug für while, und da wir nicht wollen, um tatsächlich sehen die Ausgabe, wir -q es zu unterdrücken, verwenden können. Sie können es auch ohne -q ausführen, um zu sehen, was Grep tatsächlich gefunden hat, bis Sie zufrieden sind, dass es richtig ausgeführt wird.

Weitere debuggability, würde ich Rohrs um die Ausgabe zu cat -A. Sie können Ihre Variablenwert in der while-Schleife Echo und |cat -A nur hinzufügen, unmittelbar nach dem done und es sollte alle Zeichen zeigen:

read -p "$QlabelName" input 
while /usr/sbin/networksetup -listallnetworkservices |grep -q "^${input}$"; do 
    read -p "Name already in use, please enter a unique name:" input 
    echo "Input was:'$input'" 
done |cat -A 
+0

Mit Ihrem 'grep -q"^$ {input} $ "' arbeiten Sie sofort Vorschlag Sehr schön! Vielen Dank! Auch die Pfeife zu 'cat -A' ist ein nützlicher Tipp, um es zu wissen. Nochmals vielen Dank. – TryTryAgain

Verwandte Themen