Pourquoi le shell Bourne printf itère-t-il sur un argument %s ?
Question
Que se passe t-il ici?
printf.sh :
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
Session en ligne de commande :
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
MISE À JOUR: printf "Hello, %s\n" "$NAME"
travaux.Pourquoi je n'utilise pas echo
, considérer
echo.sh :
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
Ligne de commande:
$ ./echo.sh
Filename: C: mp
Le Spécification POSIX pour echo
dit : "Les nouvelles applications sont encouragées à utiliser printf
au lieu de echo
" (pour cela et d'autres raisons).
La solution
Votre variable NAME est remplacée comme ceci :
printf "Hello, %s\n" George W. Bush
Utilisez ceci:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
Autres conseils
y a-t-il une raison spécifique pour laquelle vous utilisez printf ou echo fonctionnerait-il également pour vous ?
NAME="George W. Bush"
echo "Hello, "$NAME
résulte en
Hello, George W. Bush
modifier:La raison pour laquelle il répète "George W.Bush" est dû au fait que le Bourne Shell est délimité par des espaces.Pour continuer à utiliser printf, vous devez mettre $NAME entre guillemets doubles
printf "Hello, %s\n" "$NAME"
La façon dont j'interprète le page de manuel est-ce qu'il considère la chaîne que vous lui transmettez comme un argument ;si votre chaîne contient des espaces, elle pense que vous transmettez plusieurs arguments.Je pense que ColinYounger a raison d'entourer la variable de guillemets, ce qui oblige le shell à interpréter la chaîne comme un argument unique.
Une alternative pourrait être de laisser printf développer la variable :
printf "Hello, $NAME."
Les liens sont pour bash, mais je suis presque sûr qu'il en va de même pour sh.
Si vous souhaitez que tous ces mots soient imprimés seuls, utilisez imprimer au lieu de imprimer
imprimer prend la spécification de formatage et l'applique à chaque argument que vous transmettez.Puisque vous avez trois arguments {George, W., Bush}, il affiche la chaîne trois fois en utilisant les différents arguments.