50

サーバーの詳細を出力するbashスクリプトがあります。問題は、出力を にする必要があることJSONです。これについて最善の方法は何ですか?これがbashスクリプトです:

# Get hostname
hostname=`hostname -A` 2> /dev/null

# Get distro
distro=`python -c 'import platform ; print platform.linux_distribution()[0] + " " +        platform.linux_distribution()[1]'` 2> /dev/null

# Get uptime
if [ -f "/proc/uptime" ]; then
uptime=`cat /proc/uptime`
uptime=${uptime%%.*}
seconds=$(( uptime%60 ))
minutes=$(( uptime/60%60 ))
hours=$(( uptime/60/60%24 ))
days=$(( uptime/60/60/24 ))
uptime="$days days, $hours hours, $minutes minutes, $seconds seconds"
else
uptime=""
fi

echo $hostname
echo $distro
echo $uptime

だから私が望む出力は次のようなものです:

{"hostname":"server.domain.com", "distro":"CentOS 6.3", "uptime":"5 days, 22 hours, 1 minutes, 41 seconds"}

ありがとう。

4

7 に答える 7

96

小さなJSONのみを出力する必要がある場合は、次を使用しますprintf

printf '{"hostname":"%s","distro":"%s","uptime":"%s"}\n' "$hostname" "$distro" "$uptime"

または、より大きなJSONを生成する必要がある場合は、 leandro-moraで説明されているようにヒアドキュメントを使用してください。ヒアドキュメントソリューションを使用する場合は、必ず彼の回答に賛成してください。

cat <<EOF > /your/path/myjson.json
{"id" : "$my_id"}
EOF

最近のディストリビューションの中には、:/etc/lsb-releaseまたは同様の名前(cat /etc/*release)というファイルがあります。したがって、 Pythonへの依存をなくすことができます。

distro=$(awk -F= 'END { print $2 }' /etc/lsb-release)

余談ですが、おそらくバックティックの使用をやめるべきです。彼らは少し古風です。

于 2012-09-21T05:00:26.653 に答える