J'essaie d'écrire un script bash pour lire un fichier en tant qu'entrée et ajouter les valeurs/données de ce fichier aux variables. Les valeurs des variables doivent être mises à jour à chaque itération en fonction de la ligne d'entrée du fichier.
Exemple: le fichier d'entrée ressemble à ce qui suit:
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
En lisant ceci à travers mon script Shell, je définirai 5 variables, a, b, c, d, e.
Première itération:
Les valeurs de variable doivent être attribuées avec la première ligne du fichier d'entrée.
a=100
b=Thomas
c=Manager
d=Sales
e=$5000
Deuxième itération:
Les valeurs de variable doivent être attribuées avec la deuxième ligne du fichier d'entrée.
a=200
b=Jason
c=Developer
d=Technology
e=$5500
Etc...
Quelqu'un peut-il expliquer comment écrire un script pour lire les valeurs dans ce format?.
Vous pouvez utiliser la commande intégrée read
avec l'option _-a
_ avec une boucle pour lire chaque ligne du fichier sous forme de tableau. Vous pouvez ensuite affecter la valeur des éléments du tableau aux variables dont vous avez besoin (ou vous pouvez utiliser les éléments du tableau directement dans votre script):
_#!/bin/bash
IN_FILE='./in-file.txt'
while read -ra LINE
do
a="${LINE[0]}"; b="${LINE[1]}"; c="${LINE[2]}"
d="${LINE[3]}"; e="${LINE[4]}"
echo -e "$a\n$b\n$c\n$d\n$e\n"
done < "$IN_FILE"
_
Une autre méthode consiste à affecter les valeurs de chaque colonne de certaines lignes directement aux variables. L'exemple suivant utilise la fonction bash qui alimentera les variables avec de nouvelles valeurs lors de son appel. La fonction a un paramètre d’entrée qui détermine quelle ligne du fichier doit être analysée.
_#!/bin/bash
IN_FILE='./in-file.txt'
args_feed() {
read -r a b c d e <<< "$(sed "$1 q;d" "$IN_FILE")"
}
# -----------------
# Examples of usage
# -----------------
# Parse the third line
args_feed 3
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Sequential call - First iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Sequential call - Second iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Parse the entire file
NR_LINES="$(cat "$IN_FILE" | wc -l)"
for LINE_NR in $(seq 1 $NR_LINES)
do
args_feed "$LINE_NR"
echo -e "$a\n$b\n$c\n$d\n$e\n"
done
_
Remarques:
La valeur par défaut de $IFS
correspond aux espaces et aux tabulations, applicable dans ce cas. Pour plus de détails, veuillez lisez cette réponse encyclopédique .
L'option _-r
_ utilisée dans les deux exemples, transmise à la commande read
, empêche l'interprétation des échappements de barre oblique inversée.
Selon l'utilisation de sed
, dans le deuxième exemple, lisez cette réponse .
Pour plus d'exemples, veuillez consulter la version de prévisualisation de la réponse.