Formulation de script shell

Comment puis-je corriger la largeur en utilisant printf?

Exemple:

C'est le script:

#!/bin/bash OK=$(printf '\t%+50s\n' OK) FAIL=$(printf '\t%+50s\n' FAIL) for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do echo "$i $OK" done 

Sortie:

 a OK aa OK aaa OK aaaa OK aaaaaa OK aaaaaaaaaaaaaaaaa OK aaaaaaaaaaaaaaaaaaaaaaaaaa OK 

Je veux quelque chose comme:

 a OK aa OK aaa OK aaaa OK aaaaaa OK aaaaaaaaaaaaaaaaa OK aaaaaaaaaaaaaaaaaaaaaaaaaa OK 

Utilisez l'approche printf suivante pour get la sortie requirejse:

 #!/bin/bash for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do printf '%-50sOK\n' $i done 

Sortie de script:

 a OK aa OK aaa OK aaaa OK aaaaaa OK aaaaaaaaaaaaaaaaa OK aaaaaaaaaaaaaaaaaaaaaaaaaa OK 

  • OK – lorsque la string statique est déplacée vers FORMAT ( printf FORMAT [ARGUMENT] )

  • $i – considéré comme un argument printf

Un moyen facile:

pipe votre script à la column -t

 $ script.sh | column -t a OK aa OK aaa OK aaaa OK aaaaaa OK aaaaaaaaaaaaaaaaa OK aaaaaaaaaaaaaaaaaaaaaaaaaa OK 

Vous n'avez pas utilisé un outil qui formate la sortie et, au fur et à mesure que $i devient plus large, votre sortie ne parvient pas à s'aligner.

Remplacer

 echo "$i $OK" 

avec

 printf "%-50s %s\n" "$i" "$OK" 

(remplacez "foo" par la string réelle).

  • 50s est une string de 50 caractères de largeur fixe,
  • - (less) left-justify la string.
  • voir man 3 printf pour plus de détails sur la string de format.