
Ich habe ein einfaches Skript, das 4 Variablen von der interaktiven Tastatur „read“ nimmt, mein Befehl enthält jedoch ein Komma. Ich lese den IFS-Trennwert, aber die Beispiele zeigen nur das Lesen aus Dateien, nicht aus Tastatureingaben. Gibt es einen Trick, um die Eingabe zu ändern, oder muss ich den Befehl durch SED/AWK leiten, damit er das richtige Format hat, das das Skript lesen kann?
Das Skript ist nichts Besonderes, es gibt einfach Text ein, fügt den Eingabewert hinzu und gibt Befehlszeichenfolgen zurück, die mit dem eingegebenen Text ausgeführt werden können.
[Netzwerk] [Karte],[Port] [Hostname] 0123 0123,A1 ABCDEFG
#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing
echo -e "${green}ping test and ssh into $VAR4${NC}"
Antwort1
Um ein Komma als Worttrennzeichen zu behandeln, versuchen Sie:
IFS="$IFS," read a b c d
Dadurch wird vorübergehend ein Komma zu hinzugefügt IFS
. Dies ist die Liste der Zeichen, die die Shell als Feldtrennzeichen verwendet.
Lassen Sie uns als Beispiel einige Eingaben sammeln:
$ IFS="$IFS," read a b c d
1, 2,3 , 4
Sehen wir uns an, wie Bash diese Eingabe interpretiert hat:
$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4
Verbesserung
Wir können die Eingabeaufforderung und den Lesebefehl kombinieren:
IFS="$IFS," read -p "Enter network info: " a b c d
Dokumentation
Aus man bash
:
IFS
Der interne Feldtrenner, der für die Worttrennung nach der Erweiterung und zum Aufteilen von Zeilen in Wörter mit dem integrierten Befehl read verwendet wird. Der Standardwert ist<space><tab><newline>
Alternative
sed
Wenn Sie diese Aufgabe aus irgendeinem nicht näher genannten Grund unbedingt erledigen möchten :
read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')
Der Befehl s/,/ /g
weist sed an, jedes Komma durch ein Leerzeichen zu ersetzen. q
weist es an, nach der ersten Zeile zu beenden.
Der einsame <
zeigtUmleitungread
: Es weist die Shell an, ihre Eingabe für den Befehl aus dem dateiähnlichen Objekt zu beziehen , das in der Befehlszeile folgt.
Das Konstrukt <(...)
heißtProzesssubstitutionund erstellt aus dem in den Klammern enthaltenen Befehl ein dateiähnliches Objekt. Dieser Befehl ist der sed
Befehl, der Kommas durch Leerzeichen ersetzt.
Für den gleichen Ansatz, aber mit awk:
read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')