0
votes

comment afficher des variables avec des commentaires

Comment afficher les commentaires du fichier de variables?

Contenu de variables.conf

$VAR1         # comment
$VAR2         # comment

Script

$VAR1
$VAR2

Sortie

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


2 commentaires

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.


4 Réponses :


0
votes

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 .


3 commentaires

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.



0
votes

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


3 commentaires

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?



0
votes

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


0 commentaires

0
votes

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


2 commentaires

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 ## * #}"