コマンドの処理結果

前回、コマンドの戻り値によって想定通りの処理が行われているか判断する方法を説明しました。
では、コマンドの「処理結果」によって新たな処理を実行する場合はどうでしょう。
たとえば、算術演算の「処理結果」によって処理を判定する場合(ループ処理の回数カウント等)です。
今回はスクリプト内でのコマンド実行結果の取得について説明します。

以前、ループ処理の説明の時、以下の様なコマンドを実行してループ回数をカウントしていました。

V_COUNTER=`expr ${V_COUNTER} + 1`

これは「expr」コマンドによって算術演算(この場合、変数「V_COUNTER」に1をプラスする)を実行し、その計算の解(処理結果)を再度、変数「V_COUNTER」へ代入するという処理を行っています。
※ このように変数の値を1ずつカウントアップする事を「インクリメント」と言います

変数=`コマンド`

という形で記述すると、右辺のコマンド処理結果が左辺の変数へ代入されます。
右辺のコマンドを実行し、処理結果を得る為には「`(バッククォート)」で実行するコマンドを括る必要があります。
インクリメント以外にも以下の様な使い方ができます。
試してみて下さい。

・現在の日付を取得して、変数「V_DATE」へ格納する

V_DATE=`date`

・ホスト名を取得して、変数「V_HOST」へ格納する

V_HOST=`uname -n`

・登録されているユーザ数をカウントし、変数「V_USER_COUNT」へ格納する

V_USER_COUNT=`cat /etc/passwd | wc -l`

このようにコマンドの実行結果を変数にいれ、その値をスクリプト内で使う事ができます。
では、次の場合はどうなるでしょう?

V_LSLINE=`ls -l`

複数行出力されるコマンドの場合も同じで、普通に変数へ代入されます。
この場合、注意しなければならないのは、変数内へ「文字列」として格納されるという事です。

以下のスクリプトを「output01.sh」として記述して、実行してみてください

#!/bin/bash

V_LSLINE=`ls -l`

echo "括らない場合"
echo ${V_LSLINE}

echo "括った場合"
echo "${V_LSLINE}"

exit 0

「echo」コマンドで出力させる場合、変数を「"」で括った時と括らない時とで出力が違ってきます。
コマンド出力結果を正しく使う為に、必ず「"」で括って出力する様にしましょう。