Aligner avec printf

Résolu
bob737 Messages postés 157 Statut Membre -  
bob737 Messages postés 157 Statut Membre -
Bonjour,

j'ai une fonction "reponse" qui renvoie OK ou KO en fonction du code retour d'une commande:
function reponse
{
if [ "$?" -eq 0 ]
then
   printf "\033[1;32;40mOK\033[0m\n"
else
   printf "\033[1;31;40mKO\033[0m\n"
   echo -en "\033[0mContinue ? Y/N : "
   read answer
  case ${answer:0:1} in
    y|Y )
    true ;;


*) exit ;;
  esac
fi
}


puis

echo -en "test de la commande :"
<Ma commande>...
reponse


==> j'obtiens
test de la commande : OK ou KO


J'ai plusieurs commandes à tester et j'aimerais que tous les OK soient aligner.

test de la commande machintruc1 : ............................OK
test de la commande bidule..........................................OK
test de la commande de bidultrucmachinchouette ...OK

Je sais que printf permet de la faire mais je n'arrive pas trouver la bonne syntaxe.

Merci de votre aide.
@+

5 réponses

  1. lEprofSonDkon Messages postés 227 Statut Membre 13
     
    salut,

    passe le texte à la variable, puis
    printf '%-50s %s\n' "$texte" OK
    2
    1. bob737 Messages postés 157 Statut Membre
       
      Bonjour,

      merci, c'est presque ça.
      Pour plus de lisibilité, j'aimerais garder les .... avant le OK ou KO et donc remplacer les blancs par des "."
      un idée? :-)

      De plus, l'idéal serait que comme le shell d'origine, le texte soit affiché AVANT le résultat OK ou KO.
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    autre méthode
    $ cat code
    #!/bin/bash
    t1="test de la commande machintruc1 :"
    t2="test de la commande bidule :"
    t3="test de la commande bidultrucmachinchouette :"
    status="OK"
    printf -v x "%.0s." {1..50}; printf "%s%s%s\n" "$t1" ${x:${#t1}} $status
    status="KO"
    printf -v x "%.0s." {1..50}; printf "%s%s%s\n" "$t2" ${x:${#t2}} $status
    status="OK"
    printf -v x "%.0s." {1..50}; printf "%s%s%s\n" "$t3" ${x:${#t3}} $status
    $
    $ ./code
    test de la commande machintruc1 :.................OK
    test de la commande bidule :......................KO
    test de la commande bidultrucmachinchouette :.....OK
    1
  3. lEprofSonDkon Messages postés 227 Statut Membre 13
     
    $ texte="test de la commande pouicpouic"; echo -en "$texte"; printf '.%0.s' $(seq 1 $((50-${#texte}))); printf '%s\n' OK
    test de la commande pouicpouic....................OK
    $ texte="test de la commande milk"; echo -en "$texte"; printf '.%0.s' $(seq 1 $((50-${#texte}))); printf '%s\n' OK
    test de la commande milk..........................OK

    je ne saurais pas expliquer
    '%0.s'
    . si quelqu'un sait...

    pour l'emploi de
    seq
    , par contre, c'est parce qu'il n'y a pas de développements de variables dans un Développement d'accolades.
    0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    code simple, mais pas recommandé de le rediriger dans un fichier
    $ cat code
    t1="test de la commande machintruc1 :"
    t2="test de la commande bidule :"
    t3="test de la commande bidultrucmachinchouette :"
    status="OK"
    printf "%.0s." {1..50}; printf "%s\r%s\n" $status "$t1"
    status="KO"
    printf "%.0s." {1..50}; printf "%s\r%s\n" $status "$t2"
    status="OK"
    printf "%.0s." {1..50}; printf "%s\r%s\n" $status "$t3"
    $ ./code
    test de la commande machintruc1 :.................OK
    test de la commande bidule :......................KO
    test de la commande bidultrucmachinchouette :.....OK


    je ne saurais pas expliquer '%0.s'. si quelqu'un sait...
    http://manpagesfr.free.fr/man/man3/printf.3.html
    Une précision éventuelle, sous la forme d'un point (« . ») suivi par un nombre. ..... le nombre maximum de caractères à imprimer depuis une chaîne pour les conversions s et S.
    printf va s'exécuter N fois sans afficher les paramètres mais en affichant le texte hors format
    $ printf " hello%.0s world" {1..5}; echo
    hello world hello world hello world hello world hello world
    0
    1. lEprofSonDkon Messages postés 227 Statut Membre 13
       
      d'accord, merci.

      petite précision. c'est plutôt dans l'autre sens :
      printf
      va s'exécuter autant de fois qu'il y a d'arguments, sans les afficher, mais en affichant les indications de format (le texte dans le format)

      non ?
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      oui, par hors format, je voulais dire ce qui n'est pas précédé d'un % dans la chaine entre "
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bob737 Messages postés 157 Statut Membre
     
    Bonjour,

    Merci pour votre réponse. CE code est presque ce que je souhaite mais sauf incompréhension de ma part, il y a un point que ne convient pas à je que je souhaite faire.

    ici, la réponse est donnée APRES l'exécution de la commande. De mon côté j'aimerais que l'utilisateur voit le temps d'exécution de sa requête soit chronologiquement:

    test de la commande machintruc1 : ....................
    lancement la commande
    récupération du statut OK ou KO

    enfin:
    test de la commande machintruc1 : .................... OK ou KO
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      essayer
      $ t2="test de la commande bidule :"
      $ printf -v x "%.0s." {1..50}; printf "%s%s" "$t2" ${x:${#t2}}; sleep 4; tput bel; echo OK
      test de la commande bidule :......................OK
      0
      1. bob737 Messages postés 157 Statut Membre > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bien vu :-) mais ma commande est une requête API dont le temps d'exécution est très aléatoire. Je ne peux pas lui fixer un durée.
        0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      le sleep c'est juste comme exemple
      $ printf -v x "%.0s." {1..50}; printf "%s%s" "$t2" ${x:${#t2}}; ta_commande && echo OK || echo KO
      0
    3. bob737 Messages postés 157 Statut Membre
       
      Nickel. Merci.
      0