Maison  >  Article  >  Opération et maintenance  >  Scénario Linux--Comment résoudre le problème de codage en dur provoqué par la commande read ?

Scénario Linux--Comment résoudre le problème de codage en dur provoqué par la commande read ?

PHP中文网
PHP中文网original
2017-06-21 11:48:351621parcourir

Scénario

Nous savons que la commande read peut lire le contenu du fichier et attribuer le contenu à des variables.

Prenons le fichier de données suivant comme exemple.

$ cat data.txt
1 201623210021 wangzhiguo 25
2 201623210022 yangjiangbo 26
3 201623210023 yangzhen 24
4 201623210024 wangdong 23
5 201623210025 songdong 25

Les quatre colonnes du fichier ci-dessus sont le numéro de série (index), le numéro d'étudiant (numéro), le nom (nom) et l'âge (âge). Utilisez un script shell pour lire le fichier et afficher la valeur de chaque ligne :

$ 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

Exécutez le script et vérifiez les résultats :

$ 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

Je me demande si vous avez remarqué cela ? La méthode d'implémentation présente des inconvénients évidents :

  1. Le nom de la colonne (lire le nom du numéro d'index age) est explicitement spécifié dans le code. signification de chaque colonne du fichier de données, alors Vous devez lire le script

  2. Le script précise le nom de chaque colonne Si vous souhaitez modifier le nom anglais de chaque champ (. par exemple, si vous souhaitez que le nom anglais du numéro de série soit remplacé par NUMBER), vous devez le modifier, avec de nombreuses modifications

  3. Le script lit le. fichier de données dans un certain ordre, donc si l'ordre des colonnes dans le fichier de données change, le script doit encore être modifié

  4. S'il y a d'autres fichiers de données qui doivent être lus ; de cette façon, un nouveau script doit être réécrit en fonction de la situation réelle du fichier de données

Ci-dessus Bien que la mise en œuvre semble simple, sur la base des inconvénients ci-dessus, nous devrions également l'optimiser ; .

Solution

La solution fondamentale devrait être 写尽可能通用的脚本, qui ne dépend pas du nombre de colonnes, de l'ordre des colonnes, des noms de colonnes (significations), etc. du fichier de données lui-même.

Vous pouvez stocker les noms de champs du fichier de données dans la première ligne du fichier de données. Lors de la lecture d'un fichier de données, lisez d'abord la première ligne du fichier de données pour obtenir une liste de chaque nom de champ ; lors de la lecture d'autres lignes, faites une correspondance biunivoque entre la valeur de la première ligne et les valeurs de la non-première rangée.

Fichier de données

$ 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

Script

$ 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

Résultats

$ 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

Écrire plus général les scripts peuvent également effectuer du jugement et du traitement, comme transmettre des fichiers de données en tant que paramètres, vérifier le nombre de lignes dans le fichier de données, vérifier le nombre de colonnes dans le fichier de données, etc.

Développer les connaissances

Du point de vue de l'amélioration du script, il est légèrement plus compliqué que le script original, mais plus polyvalent.
Si vous avez des difficultés à lire des scripts, vous pouvez apprendre de manière ciblée, notamment les points de connaissances suivants :

  • Connaissances liées aux tableaux : longueur du tableau, contenu du tableau, tableau éléments, etc.

  • La différence entre les variables ${abc} et ${!abc}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn