bashでのprintfでフォーマット文字列を連結する方法:私はループ内で複数の文字列を連結し、結果を変数に割り当てる必要が
フォーマットされた文字列の例:私の見解から
result=$(printf '| %-15s| %-25s| %-15s| %-15s| %-15s\n' $size $name $visits $inbound $outbound);
それは次のように動作するはずです:
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
しかし、それはしません:(
UPD:以下のリスト
全コード:
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
**常に**あなたが質問に投稿したコードがあなたの問題を再現していることを確認してください。あなたの元の投稿はしませんでした。 'result'が空である理由は、あなたがサブシェルの中でそれに割り当てていることです。これらの変更は、サブシェルが終了すると消えます。元の質問に基づいてこれを知る方法はありませんでした。 – chepner
もう一つの注意点 - これは驚くほど恐ろしいコードです。このようにして 'ls'の出力を解析するべきではありません。その理由の説明については、http://mywiki.wooledge.org/ParsingLsを参照してください。また、 'cat |入力の1行ごとに3回grepが非常に非効率的です。 –