Voici ce que j'ai jusqu'à présent:
#!/bin/bash
while read line; do
DB=$(echo $line | cut -f1)
USER=$(echo $line | cut -f2)
PASS=$(echo $line | cut -f3)
echo DB=$DB USER=$USER PASS=$PASS
done < users.txt
Et un échantillon du fichier d'entrée:
drupal_1 drupal1 tmmjXSWL
drupal_2 drupal2 FHiJSYHM
drupal_3 drupal3 b7bFNj06
drupal_4 drupal4 0AaV62EL
Et sortie du script:
DB=drupal_1 drupal1 tmmjXSWL USER=drupal_1 drupal1 tmmjXSWL PASS=drupal_1 drupal1 tmmjXSWL
DB=drupal_2 drupal2 FHiJSYHM USER=drupal_2 drupal2 FHiJSYHM PASS=drupal_2 drupal2 FHiJSYHM
DB=drupal_3 drupal3 b7bFNj06 USER=drupal_3 drupal3 b7bFNj06 PASS=drupal_3 drupal3 b7bFNj06
Pour une raison quelconque, chaque variable est définie sur la ligne entière. Lorsque j'utilise echo users.txt | cut -f1
sur la ligne de commande, il retourne très bien le jeton.
$(echo $line | cut -d" " -f1)
fonctionne également.Le problème vient de la commande
echo $line
. Puisqu'il n'y a pas de guillemets$line
, le shell effectue la division des mots dessus, puis interprète chaque mot comme un motif de globalisation. Essayez-le avecDans votre cas, les onglets séparent les mots, qui deviennent alors des arguments distincts pour
echo
. Laecho
commande affiche ses arguments séparés par un espace. Finit donccut
par recevoir des champs délimités par des espaces au lieu de champs délimités par des tabulations.Mettez toujours des guillemets autour des substitutions de variables
$foo
et des substitutions de commandes$(foo)
(sauf si vous comprenez pourquoi vous devez les laisser de côté et pourquoi vous pouvez le faire).echo "$line"
fonctionnerait ici, mais c'est une façon compliquée de faire ce que vous proposez.En gardant votre approche de l'analyse dans le shell, vous pouvez faire en sorte que la
read
commande analyse l'entrée dans les champs.read
divise les champs séparés par des caractères dans la valeur de laIFS
variable, qui se compose d'un espace et d'une tabulation (plus une nouvelle ligne, qui ne peut pas apparaître à l'intérieur d'une ligne) par défaut. Pour diviser uniquement aux onglets, définissez d'abordIFS
sur un seul onglet. Notez que les onglets de début et de fin sont ignorés et que les onglets consécutifs comptent comme un seul.read
traite\
comme un caractère spécial: une barre oblique inverse suivie d'une nouvelle ligne sont ignorées;\\
devient une seule barre oblique inverse. Si vous souhaitez éviter ce comportement, passez l'-r
option.la source
IFS=$'\t'