Comment concaténer des chaînes formatées avec des printf dans bash

J'ai besoin de concaténer plusieurs chaînes en boucle et affecter le résultat à une variable:

Chaîne formatée exemple:

result=$(printf '| %-15s| %-25s| %-15s| %-15s| %-15s\n' $size $name $visits $inbound $outbound);

De mon point de vue, il doit travailler comme ceci:

result=''
while read somevar
do
    ...
    outbound=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|awk '{ sum+=$11} END {print sum/1024/1024}'`
    result=$(printf '%s| %-15s| %-25s| %-15s| %-15s| %-15s\n' $result $size $name $visits $inbound $outbound);
    ...
done
echo $result

Mais il n'a pas 🙁

UPD:

Complet exemple de code ci-dessous:

www_path='/var/www';
result='';
cd /var/www/; ls -d */ | while read i ; do basename "$i" ; done
while read i;
do du -sh "$i"|
        while read size name
        do
                visits=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|grep -v "internal dummy connection"|awk -F ' ' '{print $1}'  | sort | uniq | wc -l|tr '\n' '\t'|sed 's/$/\t/'`
                inbound=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|grep -v "internal dummy connection"|awk '{ sum+=$10} END {print sum/1024/1024}'|tr '\n' '\t'|sed  's/$/\t\t/'`
                outbound=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|grep -v "internal dummy connection"|awk '{ sum+=$11} END {print sum/1024/1024}'`;
                result=$(printf '%s| %-15s| %-25s| %-15s| %-15s| %-15s\n' "$result" "$size" "$name" "$visits" "$inbound" "$outbound")
        done
done
echo $result
Toujours assurez-vous que le code que vous postez une question reproduit le problème que vous rencontrez; l'original de votre post n'y est pas. La raison result est vide, c'est que vous attribuez à l'intérieur d'un shell interne est exécuté; ces modifications disparaissent après le shell interne est exécuté sorties. Il n'y avait aucun moyen pour nous de savoir ce basé sur l'original de votre question.
Sur une autre note -- c'est incroyablement horrible code. Vous ne devriez jamais analyser la sortie de ls de cette façon; voir mywiki.wooledge.org/ParsingLs pour une explication de pourquoi, également, de faire le cat | grep trois fois pour chaque ligne d'entrée est extrêmement inefficace.

OriginalL'auteur user947668 | 2013-04-13