2016-04-30 22 views
0

Ich habe ein Skript, das sich schlecht benimmt, und ich bin ratlos, warum.Bash: Einlesen in while-Schleife

#!/bin/bash 
while read -r;do 
read -rsn1 inp 
if ["$inp" = "a"]; then 
echo "$REPLY" 
fi 
done 

Das gibt:

./some.sh: line 4: [a: command not found 

Das Ziel dieses Skript ist eine Linie von der Lese am Anfang der while-Schleife zurückzukehren, wenn eine beliebige Taste einmal gedrückt wird. Offensichtlich tut es das momentan nicht. Ich verstehe die Fehler, die ich in meiner if-Anweisung gemacht habe, und suche Hilfe bei der Annahme eines einzelnen Benutzer-Tastendrucks und dann echo in einer Zeile von "$REPLY". Jede Hilfe wird geschätzt.

+0

Seit wann nicht whitespace zwischen einem Befehl und seinem ersten Argument? –

+0

Ich arbeite daran für Code Golf, so dass es ein wenig verrückt aussieht. – torchhound

+0

Code Golf oder nicht, Sie können nicht einfach Syntax erfinden ... Colons sind keine Sache in 'bash', und Sie können nicht einfach whitespace weglassen, weil es unbequem ist. – Amadan

Antwort

0

Die Syntax von if in bash ist:

if command line 
then 
    commands 
fi 

Weil Sie nicht im Raum innerhalb der Klammern gesetzt haben, falls Ihr $inp"a" ist, ist der Befehl if ausführt [a, die kein bekannter ist eingebaut, noch eine ausführbare Datei, die Sie auf Ihrem System haben. Wenn Sie if [ "$inp" = "a" ] schreiben, ist die ausgeführte Befehlszeile [ a = a; Der Befehl [, der der test entspricht, gibt eine 0 (true, kein Fehler) zurück, wenn der Test in seinen Argumenten true ergibt. Siehe man [; und das bash interne [ verhält sich genauso wie /bin/[.

Das deckt den Fehler selbst ab; aber die Logik ist immer noch falsch, um dein erklärtes Ziel zu erreichen (was eine Klärung bedeuten könnte, wenn du das auch beantwortet haben willst: Wie differenzierst du einen Schlüssel, der von der Zeile, die du anzeigen willst, abgeht? Wenn ich das richtig verstanden habe.)

+0

Wie würde ich prüfen, ob "inp" überhaupt gefüllt ist? Könnte ich das stattdessen tun: 'lies -psn1" $ REPLY "'? – torchhound

+0

'-p' benötigt ein Argument, so dass Sie eine Eingabeaufforderung von' sn1' erhalten, die dem Benutzer angezeigt wird ... nicht das, was Sie wollen, glaube ich. 'inp' wird definitiv gefüllt, weil es auf ein Zeichen wartet (außer EOF passiert). Auch hier müssen Sie klären, was Sie wollen, wenn Sie mehr wollen als "Warum scheitert mein' if' ". – Amadan

+0

Der erste Teil meines Skripts liest von 'stdin' und gibt Zeile für Zeile zurück, funktioniert bereits. Jetzt möchte ich bei jedem Drücken einer Taste eine Zeile sehen. Das hat mich dazu gebracht, ein zweites 'read' einzufügen, um einen einzelnen Benutzer zu fangen und dann 'echo' eine Zeile von' "$ REPLY" ' – torchhound

Verwandte Themen