Linuxコマンドの実行結果を変数に代入する方法

Linuxシステムで作業を効率化するためには、シェルスクリプトを駆使することが不可欠です。特にコマンドの実行結果を変数に代入することで、その結果を後続の処理で活用することが可能になります。この記事では、その基本的な方法と応用例について解説します。理解と適用を通じて、Linuxコマンドラインの使用方法をより深めましょう。

以下は主にBash向けです。代入の「=」の前後には空白を入れず、参照は原則として”$result”のように引用します。コマンド置換は末尾の改行を削除し、バイナリやNULを含むデータの完全保存には適しません。出力が空でも成功とは限らないため、成功/失敗は終了コードで判断します。

目次

基本的な代入方法

Linuxでは、コマンドの実行結果を変数に代入するためにバッククォート(`)または$()構文を使用します。どちらも標準出力を取り込めますが、可読性とネスト(入れ子)がしやすい点で$()構文の使用が推奨されています。

バッククォートを使用する方法

result=`date`
printf '%s\n' "$result"

上記のスクリプトでは、dateコマンドの実行結果がresult変数に代入され、printfで引用した値が表示されます。しかし、バッククォートは引用符(’または”)と見分けにくいため、誤解を招くことがあります。

$()構文を使用する方法

result=$(date)
printf '%s\n' "$result"

この方法では、dateコマンドの実行結果がresult変数に代入されます。$()構文はネストが容易であり、より複雑なコマンドの組み合わせも扱いやすいです。

この基本的な代入方法をマスターすることで、Linuxでの作業効率が大きく向上します。次のセクションでは、コマンド実行結果の扱い方について、より詳細に解説します。

コマンド実行結果の扱い方

コマンドの実行結果を変数に代入した後、その変数を使用してさまざまな処理を行うことができます。ここでは、実行結果を活用するいくつかの基本的な方法について解説します。

変数の値を使用する

変数に代入された値は、その変数を参照することでスクリプト内のどこでも使用することができます。変数を参照する際には、変数名の前にドル記号($)を付けます。

# GNU find: current directory regular files, including hidden files
file_count=$(find . -maxdepth 1 -type f -printf x | wc -c)
printf 'File count: %s\n' "$file_count"

条件分岐での使用

変数に代入された実行結果を条件分岐の判断材料として使用することも可能です。これにより、コマンドの結果に応じて異なるアクションを取るスクリプトを作成できます。

# 特定のファイルが存在するかどうかを確認
file_name="example.txt"
if [ -e "$file_name" ]; then
  echo "$file_name exists."
else
  echo "$file_name does not exist."
fi

ループ処理での使用

変数に代入されたコマンドの実行結果をループ処理で使用することで、結果の各要素に対して一連の操作を行うことができます。

# Non-hidden entries; do not parse ls output
for file in ./*; do
  [ -e "$file" ] || [ -L "$file" ] || continue
  printf 'Processing: %s\n' "$file"
done

このように、コマンドの実行結果を変数に代入し、その値をスクリプト内で活用することで、柔軟かつ強力なシェルスクリプトを作成することが可能になります。次のセクションでは、複数行の出力を扱う方法について詳しく説明します。

複数行の出力を扱う方法

コマンドの実行結果が複数行にわたる場合、その結果を効率的に扱う方法を知ることが重要です。複数行の出力を変数に代入し、ループや配列を利用して処理する技術は、スクリプトの応用範囲を広げます。

複数行の出力をループで処理する

コマンドの結果を行ごとに処理する場合、forループを使用するのが一般的です。しかし、この方法では空白文字で分割された各要素がループの各繰り返しで処理されるため、意図しない動作をすることがあります。より安全に複数行の出力を扱うには、whileループとreadコマンドを組み合わせる方法が推奨されます。

# Bash: preserve spaces and backslashes in text lines
while IFS= read -r line; do
  printf 'Line: %s\n' "$line"
done < <(printf '%s\n' 'first line' 'second line')

この例は改行で区切られた一般テキストを処理します。IFS=とread -rで空白やバックスラッシュを保ちます。任意のファイル名には改行も含まれるため、ファイル列挙をlsの行分割として扱わないでください。

配列に複数行の出力を代入する

bashシェルでは、複数行の出力を配列に代入し、その配列を通じて結果を扱うこともできます。これにより、特定の行にアクセスしたり、配列の要素数を確認したりすることが容易になります。

# Bash mapfile: one text line per element
mapfile -t lines < <(printf '%s\n' 'first line' 'second line')
for line in "${lines[@]}"; do
  printf 'Line: %s\n' "$line"
done

mapfile -tは改行区切りのテキストを配列へ読み、区切りの改行を取り除きます。Bash専用であり、shへそのまま渡す例ではありません。ファイル名一覧には前節のglobなど、名前を分割しない方法を使います。

複数行の出力を効果的に扱うことで、スクリプトの柔軟性と表現力が大幅に向上します。これらのテクニックをマスターすることで、より複雑なシェルスクリプトの作成が可能になります。次のセクションでは、エラー出力の代入方法について解説します。

エラー出力の代入方法

Linuxシェルスクリプトでは、コマンドからの標準出力だけでなく、エラー出力も変数に代入して扱うことができます。エラー出力を適切に処理することは、スクリプトの信頼性と使いやすさを高める上で重要です。

標準出力と標準エラーをまとめて代入

2>&1は標準エラーを標準出力と同じ出力先へまとめます。標準出力も出るコマンドなら両方が変数に入り、エラーだけを抽出する指定ではありません。終了コードは直後に取得します。

# This merges stdout and stderr; it is not stderr-only
if error_output=$(ls non_existing_file 2>&1); then
  rc=0
else
  rc=$?
fi
printf 'exit=%s\n%s\n' "$rc" "$error_output"

この例では、存在しないファイルに対してlsコマンドを実行しようとしています。標準エラー出力(エラーメッセージ)が変数error_outputに代入され、その後で表示されます。

標準出力と標準エラー出力を別々の変数に代入

標準出力と標準エラー出力を別々に扱いたい場合は、コマンド実行時にそれぞれを異なる変数にリダイレクトすることができます。

# Standalone Bash example; replace demo_command with your command
tmpdir=$(mktemp -d) || exit 1
trap 'rm -rf -- "$tmpdir"' EXIT
demo_command() { printf 'normal output\n'; printf 'error output\n' >&2; return 7; }
if demo_command >"$tmpdir/stdout" 2>"$tmpdir/stderr"; then
  rc=0
else
  rc=$?
fi
output=$(cat "$tmpdir/stdout")
error=$(cat "$tmpdir/stderr")
printf 'exit=%s\nstdout=%s\nstderr=%s\n' "$rc" "$output" "$error"

上のデモは1回の実行のstdoutとstderrを別ファイルへ保存し、その後別々の変数へ読みます。終了コード7も保持します。コマンド置換で末尾改行は失われるため、内容をバイト単位で保つなら変数へ読み戻さずファイルを使います。trapは作成した一時ディレクトリだけを終了時に消す、独立したスクリプトの例です。既存スクリプトのtrapを上書きしないよう統合時に確認してください。

エラー出力を無視する

場合によっては、エラー出力を完全に無視したいこともあります。エラー出力を無視するには、エラー出力を/dev/nullにリダイレクトします。

# Replace your_command with an actual command
if output=$(your_command 2>/dev/null); then
  printf '%s\n' "$output"
else
  rc=$?
  printf 'Command failed: %s\n' "$rc" >&2
fi

このコマンドでは、エラー出力が/dev/nullにリダイレクトされ、標準出力のみが変数に代入されます。ただし、エラー表示を消しても失敗が成功になるわけではありません。例では終了コードを確認し、失敗を別途表示します。原因調査中は標準エラーを残すほうが有用です。

エラー出力の適切な扱いは、スクリプトのエラーハンドリングを改善し、より堅牢なシステムを構築する上で欠かせません。次のセクションでは、これらの技術を活用した実用的なスクリプト例を紹介します。

実用的なスクリプト例

実際のシナリオでLinuxコマンドの実行結果を変数に代入して使用する方法を示す実用的なスクリプト例をいくつか紹介します。これらの例は、基本的な代入方法からエラー出力の扱いまで、前述のテクニックを応用したものです。

ディスク使用量をチェックし、閾値を超えていれば警告する

ディスクの使用量を監視し、特定の閾値を超えた場合に警告メッセージを出力するスクリプトです。dfコマンドを使用してディスク使用率を取得し、条件分岐を用いて閾値チェックを行います。

# GNU/Linux example: validate before numeric comparison
if df_output=$(LC_ALL=C df -P /); then
  disk_usage=$(printf '%s\n' "$df_output" | awk 'NR==2 {gsub(/%/, "", $5); print $5}')
else
  printf 'df failed\n' >&2
  exit 1
fi
case "$disk_usage" in
  ''|*[!0-9]*) printf 'Invalid usage value\n' >&2; exit 1 ;;
esac
alert_threshold=90
if [ "$disk_usage" -gt "$alert_threshold" ]; then
  printf 'Above threshold: %s%%\n' "$disk_usage"
else
  printf 'Usage: %s%%\n' "$disk_usage"
fi

Webサーバーの通信終了コードとHTTP応答を確認する

curlの通信成否とHTTPステータスは別です。301などの転送や401・403などの認証/権限エラーも200以外になるため、これだけでnginxを再起動してはいけません。次の例は時間制限を設けて結果を表示するだけです。ネットワーク確認を含めて原因を調べ、サービス変更は管理手順に従って判断します。

# Use a URL you are authorized to monitor
url=https://example.com/
if response=$(curl -sS --connect-timeout 5 --max-time 15 -o /dev/null -w '%{http_code}' "$url"); then
  printf 'HTTP status: %s\n' "$response"
else
  rc=$?
  printf 'Transport failure: curl=%s, HTTP=%s\n' "$rc" "$response" >&2
fi
# Do not automatically restart a service based only on non-200 status

システムにインストールされているパッケージのリストを取得し、ファイルに保存する

システムにインストールされているパッケージのリストを取得して、それをファイルに保存するスクリプトです。dpkgコマンド(Debian系のシステムで使用)の実行結果を変数に代入し、それをファイルにリダイレクトします。

# Debian-based systems: avoid overwriting an existing report
if installed_packages=$(dpkg --list | grep '^ii'); then
  (set -C; printf '%s\n' "$installed_packages" > installed_packages_list.txt)
else
  printf 'Package list could not be obtained; inspect the cause.\n' >&2
fi

これらのスクリプト例は、日常的なシステム管理タスクを自動化する基礎となります。変数にコマンドの実行結果を代入することで、Linuxシステムの管理をより柔軟かつ効率的に行うことが可能になります。

まとめ

Linuxでコマンドの実行結果を変数に代入する方法は、シェルスクリプトを書く上で非常に強力なテクニックです。この記事では、基本的な代入方法から始まり、複数行の出力の扱い方、エラー出力の代入方法、そしてこれらを応用した実用的なスクリプト例までを解説しました。これらの知識を活用することで、Linuxシステムの管理や自動化スクリプトの作成が、より柔軟で効率的に行えるようになります。コマンドの実行結果を変数に代入する技術をマスターすることで、あなたのシェルスクリプティング能力を次のレベルへと引き上げましょう。

一次資料:Bashのコマンド置換/リダイレクト/curl公式マニュアル。2026年10月20日確認。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次