Wir wissen, dass der Lesebefehl den Inhalt der Datei lesen und den Inhalt Variablen zuweisen kann.
Nehmen Sie die folgende Datendatei als Beispiel.
$ cat data.txt
1 201623210021 wangzhiguo 25 2 201623210022 yangjiangbo 26 3 201623210023 yangzhen 24 4 201623210024 wangdong 23 5 201623210025 songdong 25
Die vier Spalten der obigen Datei sind Seriennummer (Index), Schülernummer (Nummer), Name (Name) und Alter (Alter). Verwenden Sie ein Shell-Skript, um die Datei zu lesen und den Wert jeder Zeile auszugeben:
$ cat read_data.sh
#!/bin/bash cat data.txt | while read index number name age do echo "index:${index}" echo "number:${number}" echo "name:${name}" echo "age:${age}" echo " " done
Führen Sie das Skript aus und überprüfen Sie die Ergebnisse:
$ sh read_data.sh
index:1 number:201623210021 name:wangzhiguo age:25 index:2 number:201623210022 name:yangjiangbo age:26 index:3 number:201623210023 name:yangzhen age:24 index:4 number:201623210024 name:wangdong age:23 index:5 number:201623210025 name:songdong age:25
Das frage ich mich Wenn Sie das bemerkt haben? Die Implementierungsmethode hat offensichtliche Nachteile:
Der Spaltenname (Alter des Indexnummernnamens) wird explizit im Code angegeben Bedeutung jeder Spalte der Datendatei, dann müssen Sie das Skript lesen;
Das Skript gibt den Namen jeder Spalte an. Wenn Sie den englischen Namen jedes Felds ändern möchten. Wenn Sie beispielsweise möchten, dass der englische Name der Seriennummer in NUMBER
geändert wird, müssen Sie das Skript mit vielen Änderungen ändern Wenn sich also die Spaltenreihenfolge in der Datendatei ändert, muss das Skript trotzdem geändert werden.
Wenn andere Datendateien eingelesen werden müssen Auf diese Weise muss ein neues Skript basierend auf der tatsächlichen Situation der Datendatei neu geschrieben werden.
Oben Obwohl die Implementierung aufgrund der oben genannten Nachteile einfach erscheint, sollten wir sie auch optimieren .
Die grundlegende Lösung sollte
sein, die nicht von der Anzahl der Spalten, der Spaltenreihenfolge, den Spaltennamen (Bedeutungen) usw. der Datendatei selbst abhängt. Sie können die Feldnamen der Datendatei in der ersten Zeile der Datendatei speichern. Wenn Sie eine Datendatei lesen, lesen Sie zuerst die erste Zeile der Datendatei, um eine Liste aller Feldnamen zu erhalten. Stellen Sie beim Lesen anderer Zeilen eine Eins-zu-Eins-Entsprechung zwischen dem Wert in der ersten Zeile und den Werten in her die nicht erste Reihe.写尽可能通用的脚本
Datendatei
Skript
$ cat new_data.txt
index number name age 1 201623210021 wangzhiguo 25 2 201623210022 yangjiangbo 26 3 201623210023 yangzhen 24 4 201623210024 wangdong 23 5 201623210025 songdong 25
Ergebnisse
$ cat new_read_data.sh
#!/bin/bash # 读取文件头行,存于一个数组中 tablehead=(`head -n 1 new_data.txt`) # 从文件第二行开始读取,按上述数组顺序读取各字段 tail -n +2 new_data.txt | while read ${tablehead[*]} do # 遍历数组的下标,获取tablehead数组的对应值,以及以该值命名的变量的值 for i in `seq 0 $((${#tablehead[@]}-1))` do temp=${tablehead[$i]} echo "${temp}:${!temp}" done echo "" done
Schreiben Sie mehr Allgemeines aus Skripte können auch einige Beurteilungen und Verarbeitungen durchführen, z. B. Datendateien als Parameter übergeben, die Anzahl der Zeilen in der Datendatei überprüfen, die Anzahl der Spalten in der Datendatei überprüfen usw.
$ sh new_read_data.sh
index:1 number:201623210021 name:wangzhiguo age:25 index:2 number:201623210022 name:yangjiangbo age:26 index:3 number:201623210023 name:yangzhen age:24 index:4 number:201623210024 name:wangdong age:23 index:5 number:201623210025 name:songdong age:25
Aus Sicht der Skriptverbesserung ist es etwas komplizierter als das Originalskript, aber vielseitiger.
Wenn Ihnen das Lesen von Skripten schwerfällt, können Sie gezielt vor allem die folgenden Wissenspunkte erlernen:
Array-bezogenes Wissen: Array-Länge, Array-Inhalt, Array Elemente usw.
Der Unterschied zwischen den Variablen
und${abc}
Das obige ist der detaillierte Inhalt vonLinux-Szenario - Wie kann das durch den Lesebefehl verursachte Problem der harten Codierung gelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!