Comment afficher les commentaires du fichier de variables?
$VAR1 # comment $VAR2 # comment
$VAR1 $VAR2
VAR1=./variables.conf for file in $(cat $VAR1 | sed 's/^/$/'); do echo "${file%=*}" done
J'ai besoin que la sortie soit comme ça et je ne peux pas comprendre
VAR1=/destination1 # comment VAR2=/destination2 # comment
4 Réponses :
Les commentaires sont par définition invisibles en dehors du script, ils ne peuvent pas être exportés ou utilisés (enfin, un peu, mais c'est une autre histoire).
Il serait possible de faire ce que vous entendez en créant deux variables chaîne avec les commentaires voulus et plus tard, utilisez une commande echo pour les afficher, quelque chose comme:
#! /bin/bash comment1="# Hey-ho" comment2="# Let's go" VAR1=/destination1 VAR2=/destination2 echo -e "$VAR1 $comment1\n$VAR2 $comment2" #why waste a good echo ;)
Cela devrait faire le travail. Vous pouvez BTW sauter de '#' car ce qui sera affiché est évidemment une chaîne, mais juste pour garder votre syntaxe. Et bien sûr, ma dernière recommandation ne sera pas imprimée.
Bien sûr, vous devrez dupliquer le travail, mais comme je l'ai dit, les commentaires sont des commentaires et ne sont pas destinés à être affichés à moins que vous ne lisiez le code .
dans l'exemple ci-dessus variables.conf ce n'est pas un fichier #! / bin / bash et si votre exécution VAR1 =. / variables.conf pour le fichier dans $ (cat $ VAR1 | sed 's / ^ / $ /'); do echo "$ {file% = *}" done this affiche tout le contenu qui est présent sous variables.conf l'ajout de commentaires en tant que variable séparée peut fonctionner mais son travail supplémentaire n'est pas nécessaire. Je pense que la solution ici pourrait être ici echo "$ { file% = *} "+ (quelque chose pour afficher les commentaires)
Vous devez utiliser echo -e
. Sinon, le \ n
n'est pas analysé. De plus, c'est beaucoup de programmation et on s'attend à ce que le programmeur conserve des variables pour chaque commentaire. Je suggérerais plutôt de déclarer un hashmap et de stocker la valeur correspondante sous la forme [VAR1] = "comment
. De cette façon, vous pouvez le rendre plus dynamique.
Salut, THX j'oublie toujours :) Mais bonne idée celle avec la hasmap! En tout cas, j'essayais juste de faire comprendre que c'est beaucoup de travail pour (presque) rien. À moins que l'OP n'ait un bon cas d'utilisation, bien sûr.
J'ai écrit une petite fonction pour vous. Je m'attends à ce que le var ne soit pas défini deux fois, sinon vous devrez vous assurer que grep
ne reçoit que le premier. De plus, cela ne fonctionnera pas sur les très anciennes versions de bash, j'utilise la version 5.0.3
.
$ ./tst.sh /destination1 # comment 1 /destination2 # comment 2
Cela génère:
#! /bin/bash SCRIPTNAME=$0 VAR1=/destination1 # comment 1 VAR2=/destination2 # comment 2 function print_comment { local var_name=$1 local -n var_content=$1 local comment="" comment=$(grep -E "^${var_name}=.*" $SCRIPTNAME | sed -r 's/^[^#].*(#.*)$/\1/') echo "$var_content $comment" } print_comment VAR1 print_comment VAR2 exit 0
L'indicateur -n
est depuis introduit dans bash-4.3 selon cette réponse.
merci pour l'aide cela pourrait fonctionner mais malheureusement je n'utilise pas la commande locale postfix dans cet environnement. Pensez-vous que cela pourrait être fait autrement? De plus, je ne garde pas de variables dans ce même script. Je garde les variables sous différents fichiers où je les tire par VAR1 =. / Variables.conf
Voulez-vous dire que local
n'existe pas? De plus, source
ces fichiers?
Un moyen de mapper le nom de la variable comme clé et le commentaire comme valeur dans un tableau associatif Bash 4+:
#!/usr/bin/env bash varfile='variables.conf' # shellcheck source=./variables.conf . "$varfile" # shellcheck disable=SC2155 # safe assignement declare -A comments="($( while IFS=$'\37' read -r k v; do printf '[%q]=%q\n' "$k" "$v" done< <(sed 's/^\([^=]*\)=[^#]\+#\ \?\(.*\)/\1\x1F\2/' "$varfile") ))" for varname in "${!comments[@]}"; do comment="${comments[$varname]}" value="${!varname}" printf '%-20s %-30s %s\n' "$varname" "$value" "$comment" done
Je ne sais pas pourquoi les gens compliquent si mal cela. Bouclez simplement ligne par ligne et extrayez le commentaire comme vous extrayez le nom:
sed -e 's/^/$/; s/=[^#]*/ /' "$VAR1"
ou faites tout simplement avec sed
en premier lieu:
VAR1=./variables.conf sed 's/^/$/' "$VAR1" | while read -r file do echo "${file%=*} #${file##*#}" done
c'est un excellent point! cela fonctionne aussi comme j'ai besoin de l'aide. Il n'y a qu'une seule question de plus: Comment ajuster les commentaires pour qu'ils s'alignent
Vous pouvez aligner et formater avec printf
: printf '% -30s #% s \ n' "$ {file% = *}" "$ {file ## * #}" code>
Les commentaires sont ignorés lorsque le shell lit la ligne. Vous ne pouvez donc pas les récupérer. Mais si vous avez la source, vous pouvez rechercher une définition de variable. Mais vous donnez au commentaire une signification sémantique, ce qui va à l'encontre du principe des commentaires. Et si un utilisateur mettait un commentaire sur la ligne avant la définition? Si vous voulez des données, vous devez créer une convention, par exemple VAR1_NOTE = "quelque chose"
@RafalNiznik: Vous pouvez définir un tableau associatif, où les clés sont les noms des variables et les commentaires les valeurs des variables. Je ne vois pas à quoi cela servirait, mais après tout, l'idée même de stocker des commentaires dans des variables est un peu inutile. Vous pouvez utiliser un langage de programmation dans lequel vous pouvez insérer des informations supplémentaires dans des variables; LISP commun par exemple.