web-dev-qa-db-fra.com

SPRINTF dans les scripts Shell?

J'ai un fichier généré automatiquement chaque jour qui est appelé par un script Shell. Mais, le problème auquel je suis confronté est que le fichier généré automatiquement a une forme de:

FILE_MM_DD.dat

... où MM et DD sont des chaînes de mois et de jour du mois à 2 chiffres.

J'ai fait quelques recherches et je l'ai fait moi-même, mais je ne sais pas comment créer ces chaînes personnalisées en utilisant uniquement des scripts Shell.

Pour être clair, je connais la fonction DATE dans Bash, mais ce que je recherche, c'est l'équivalent de la fonction SPRINTF en C.

37
Manu R

Dans Bash:

var=$(printf 'FILE=_%s_%s.dat' "$val1" "$val2")

ou, l'équivalent, et plus proche de sprintf:

printf -v var 'FILE=_%s_%s.dat' "$val1" "$val2"

Si vos variables contiennent des valeurs décimales avec des zéros non significatifs, vous pouvez supprimer les zéros non significatifs:

val1=008; val2=02
var=$(printf 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2)))

ou

printf -v var 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2))

La $((10#$val1)) contraint la valeur en base 10 donc le %d Dans la spécification de format ne pense pas que "08" est une valeur octale invalide.

Si vous utilisez date (au moins pour GNU date), vous pouvez omettre les zéros de tête comme ceci:

date '+FILE_%-m_%-d.dat'

Pour être complet, si vous voulez ajouter zéros de tête, remplis à une certaine largeur:

val1=8; val2=2
printf -v var 'FILE=_%04d_%06d.dat' "$val1" "$val2"

ou avec des largeurs dynamiques:

val1=8; val2=2
width1=4; width2=6
printf -v var 'FILE=_%0*d_%0*d.dat' "$width1" "$val1" "$width2" "$val2"

L'ajout de zéros non significatifs est utile pour créer des valeurs qui se trient facilement et s'alignent parfaitement dans les colonnes.

53
Dennis Williamson

Pourquoi ne pas utiliser le programme printf de coreutils?

$ printf "FILE_%02d_%02d.dat" 1 2
FILE_01_02.dat
8
Daniel Böhmer