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.
KEY=VALUE
paires? Les solutions sont très différentes (si c'est ce dernier, la réponse de Takkat s'applique, l'ancien Radu)Réponses:
Pour lire les variables d'un fichier, nous pouvons utiliser la commande
source
ou.
.Supposons que le fichier contienne la ligne suivante
nous pouvons ensuite importer cette variable en utilisant
la source
<filename>
qui se trouve dans votre shell sera exécuté, par exemplerm -rf /
, ce qui pourrait être très dangereux.sed
pour ajouter unlocal
mot clé et rendre le script un peu plus sûr et ne pas modifier votre portée globale. Donc, à l'intérieur d'une fonction, faitescat global_variables.sh | sed -e 's/^/local /' > local_variables.sh
puis utilisez. ./local_variables.sh
. Tout ce que vous importez dans la fonction ne sera disponible que dans cette fonction. Notez que cela suppose qu’ilglobal_variables.sh
ne contient qu’une variable par ligne.Considérant que vous voulez que tout le contenu de votre fichier texte soit conservé dans votre variable, vous pouvez utiliser:
Ou, en pure bash:
la source
echo $name
. Je l'utilise juste pour le test. Ensuite, vous pouvez utiliser la$name
variable pour un traitement ultérieur où vous le souhaitez dans votre script.$name
variable est la chaîne de votre fichier affectée à l'aide de lacat $file
commande. Qu'est-ce qui n'est pas clair ou si difficile à comprendre?$file
variable séparée si vous ne l'utilisez qu'une seule fois pour la charger$name
, utilisez simplementcat /path/to/file
Dans votre script, vous pouvez faire ceci:
Vous pouvez même le faire plusieurs fois, par exemple dans une boucle
la source
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
)et le fichier d'entrée (appelé
input.in
)vous pouvez l'exécuter depuis le terminal de l'une des deux manières suivantes:
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ădeanu l' a déjà suggéré , vous pouvez utiliser
cat
votre script pour lire le contenu d'un fichier dans une variable. Dans ce cas, chaque fichier doit contenir une seule ligne, avec uniquement la valeur souhaitée pour cette variable spécifique. Dans l'exemple ci - dessus, vous souhaitez diviser le fichier d'entrée en un avec le nom ( par exemple,name.in
) et une avec l'âge (disonsage.in
) et modifiez lesread name
etread age
lignesname=$(cat name.in)
etage=$(cat age.in)
respectivement.la source
vh=$(awk "NR==3 {print;exit}" /var/www/test.txt)
. Vous aurez alors la chaîne enregistrée dans variable$vh
, vous pourrez donc l'utiliser comme suit:mkdir "/var/www/$vh"
- cela créera un dossier avec le nom spécifié dans / var / www.J'ai trouvé une solution de travail ici: https://af-design.com/2009/07/07/loading-data-into-bash-variables/
la source
A partir de
man bash:1785
, cette substitution de commande est équivalente àname=$(cat "$file")
mais plus rapide.la source
Réponse courte:
la source
Si vous souhaitez utiliser plusieurs chaînes, vous pouvez utiliser:
OU
Si vous voulez que l'utilisateur indique le fichier
la source
la source
J'utilise ceci pour obtenir une seule variable d'un fichier
Quand
GET_VAR
ne se trouve pas dans${FILE}
ce sera vide plutôt que de causer une erreur grâce au|| true
.Il utilise
grep -P
ce qui est dans GNU grep mais pas par défaut dans tous les grep au moment de l'écriture de ceci.la source