web-dev-qa-db-fra.com

Comment lire une variable d'un fichier?

Je veux insérer dans mon script une valeur (chaîne) que je lirais à partir d'un fichier texte.

Par exemple, au lieu de:

echo "Enter your name"
read name

Je veux lire une chaîne d'un autre fichier texte afin que l'interprète lise la chaîne du fichier et non la saisie de l'utilisateur.

62
user208413

Pour lire les variables d'un fichier, nous pouvons utiliser la commande source ou ..

Supposons que le fichier contienne la ligne suivante

MYVARIABLE="Any string"

nous pouvons ensuite importer cette variable en utilisant

#!/bin/bash

source <filename>
echo $MYVARIABLE
92
Takkat

Considérant que vous voulez que tout le contenu de votre fichier texte soit conservé dans votre variable, vous pouvez utiliser:

#!/bin/bash

file="/path/to/filename" #the file where you keep your string name

name=$(cat "$file")        #the output of 'cat $file' is assigned to the $name variable

echo $name               #test

Ou, en pure bash:

#!/bin/bash

file="/path/to/filename"     #the file where you keep your string name

read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable

echo $name                   #test
53
Radu Rădeanu

Dans votre script, vous pouvez faire ceci:

read name < file_containing _the_answer

Vous pouvez même le faire plusieurs fois, par exemple. en boucle

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
9
thom

Une autre solution consiste à rediriger simplement l’entrée standard dans votre fichier, où toutes les entrées de l’utilisateur sont dans l’ordre dans lequel il est attendu par le programme. Par exemple, avec le programme (appelé script.sh)

#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age

# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"

et le fichier d'entrée (appelé input.in)

Tomas
26

vous pouvez l'exécuter depuis le terminal de l'une des deux manières suivantes:

$ cat input.in | ./script.sh
$ ./script.sh < input.in

et cela équivaudrait à exécuter le script et à entrer les données manuellement - la ligne "Bonjour Tomas. Vous avez 26 ans, n'est-ce pas?".

Comme Radu Rădean a déjà suggéré , vous pouvez utiliser cat dans votre script pour lire le contenu d'un fichier dans une variable. Dans ce cas, chaque fichier doit contenir uniquement une ligne, avec seulement la valeur que vous voulez pour cette variable spécifique. Dans l'exemple ci-dessus, vous scindiez le fichier d'entrée en un fichier avec le nom (par exemple, name.in) et un autre avec l'âge (par exemple, age.in), puis modifiez les lignes read name et read age en name=$(cat name.in) et age=$(cat age.in), respectivement.

6
Tomas Aschan

J'ai trouvé la solution de travail ici: https://af-design.com/2009/07/07/loading-data-into-bash-variables/

if [ -f $SETTINGS_FILE ];then
    . $SETTINGS_FILE
fi
2
Lukasz
name=$(<"$file") 

De man bash:1785, cette substitution de commande est équivalente à name=$(cat "$file") mais plus rapide.

2
hellork

Réponse courte:

name=`cat "$file"`
2
nedim
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


variableInFile ${@}
0

J'utilise ceci pour obtenir une seule variable d'un fichier

GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)

Lorsque GET_VAR n'est pas trouvé dans ${FILE}, il sera vide plutôt que de provoquer une erreur grâce au || true.

Il utilise grep -P qui est dans GNU grep mais pas par défaut dans tous les grep au moment de l'écriture de ceci.

0
Eric Nemchik

Si vous souhaitez utiliser plusieurs chaînes, vous pouvez utiliser:

path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it) 

OR

Si vous voulez que l'utilisateur indique le fichier

read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................
0
George