function runstatus {
echo "SVN Status -uq:"
echo
status=$(svn status -uq)
echo $status
echo $bigline
}
Cela affiche quelque chose comme:
Statut SVN -uq:
rd_backup rd_backup.sh update 764 update Statut par rapport à la révision: 771
Alors que normalement, en exécutant manuellement la commande au lieu de ./update
, cela ressemble à:
svn status -uq
M * 764 mise à jour
Statut contre révision: 771
c'est-à-dire avec des nouvelles lignes. Comment puis-je m'assurer que le formatage reste identique et qu'il est lisible lors de l'exécution d'un script?
svn status -uq
au lieu deecho
la sortie de$(svn status -uq)
?Réponses:
Si vous voulez qu'une fonction ne montre que le résultat d'une commande, il n'est pas nécessaire de capturer le résultat, puis
echo
à nouveau.Il suffit de courir
svn status -uq
directement. La sortie standard sera également sortie de l'appel de fonction.Si vous avez vraiment besoin d'utiliser des variables et
echo
les, vous devez citer l'argument passé àecho
si vous voulez les espaces blancs à conserver:echo "$status"
.La raison en est qu'il
$status
contiendra littéralement les éléments suivants:Quand vous courez
echo $status
,echo
s'appellera comme ceci:C'est plus d'un paramètre, puisque Bash divise les arguments en espaces ( voir
$IFS
).echo
imprimera chaque argument, séparé par un espace. Ainsi, alors que le reste de la ligne aura l’air parfait, la nouvelle ligne sera - par essence - réduite à un espace.Si vous entourez l'argument avec une citation,
echo
il ne le verra que comme un argument et le restituera correctement.Le Wiki Bash a une bonne lecture sur les citations et énumère quelques raisons pour lesquelles vous devriez toujours citer vos variables à quelques exceptions près.
la source