Linuxシェル変数の使い方を完全ガイド!Bashで値を保存して活用する基本
生徒
「Linux(リナックス)のコマンドを勉強していると、変数(ヘンスウ)という言葉をよく聞きます。これって何ですか?」
先生
「変数は、データや文字列を一時的に保存しておくための『箱』のようなものですよ。Bash(バッシュ)などのシェルで、よく使われます。」
生徒
「箱ですか。なんだかプログラミングみたいで難しそうですね。初心者でも使いこなせますか?」
先生
「実はとてもシンプルです!名前を付けて値をいれるだけで、作業を自動化したり効率化したりできるんです。基本からゆっくり解説しますね。」
Linuxを初めて学ぶ人や、 OS・プロセス・メモリ管理・仮想マシン・コンテナの仕組みを図解で理解したい人におすすめの定番書籍です。
試して理解 Linuxのしくみを見る※ Amazonアソシエイト広告リンク
1. Linuxのシェル変数とは?
Linux(リナックス)を使っていると、特定の文字列や数値、あるいはファイルパスなどを何度も再利用したい場面が出てきます。その際に、値を一時的に格納しておく仕組みをシェル変数(シェルヘンスウ)と呼びます。
シェルとは、ユーザーが入力した命令をOS(オーエス)に伝えるための仲介役プログラムのことです。現在、多くのLinuxディストリビューションで標準採用されているのはBash(バッシュ)やZsh(ゼットシェット)といったシェルです。これらのシェル上で「変数」という名前の付いた箱に文字や数字を保存しておくことで、後からその名前を呼ぶだけで中身を取り出せるようになります。
例えば、非常に長いディレクトリのパスを「DIR」という短い名前に保存しておけば、次回からそのパスを手入力する手間が省けます。これはタイピングミスの防止や、作業効率の向上に直結する非常に重要な機能です。
2. 変数の定義と代入の基本ルール
変数を新しく作ることを「定義(テイギ)」、その変数に値を入れることを「代入(ダイニュウ)」と言います。Bash(バッシュ)で変数を扱う際には、いくつか厳守しなければならないルールがあります。
最も重要なルールは、「=(イコール)」の前後にスペースを入れないことです。プログラミング言語によってはスペースを入れても見やすいように解釈してくれますが、シェルスクリプトの世界ではスペースは「命令の区切り」を意味するため、エラーになってしまいます。
また、変数名には英数字とアンダースコアが使えますが、数字から始めることはできません。一般的に、自分で作成するシェル変数は小文字で、OSやシェルが最初から用意している環境変数は大文字で記述するのが慣習となっています。まずは、簡単な文字列を変数に入れて表示させてみましょう。
name=LinuxUser
echo $name
LinuxUser
上記の例では、nameという変数にLinuxUserという文字列を代入しています。表示するときに、変数名の前に$(ダラー)を付けるのがポイントです。
3. 変数の中身を表示するechoコマンドの使い方
変数に保存した値を確認するには、echo(エコー)コマンドを使用します。echoは、指定した引数を標準出力(画面)に表示するコマンドです。変数を表示したい場合は、必ず変数名の先頭に記号の「$」を付与します。
もし「$」を付け忘れると、シェルはそれを変数ではなく、ただの文字列として認識してしまいます。例えば、echo nameと打つと、画面には「name」とだけ表示されます。中身の「LinuxUser」を見たいなら、必ずecho $nameとする必要があります。
また、変数と他の文字列を繋げて表示したい場合は、波括弧(なみかっこ)を使って変数の範囲を明確にすることが推奨されます。これを「変数展開(ヘンスウテンカイ)」と呼びます。
greeting="Hello"
echo "${greeting}World"
HelloWorld
このように${変数名}と書くことで、どこまでが変数名なのかをシェルに正確に伝えることができます。これにより、意図しない動作を防ぐことが可能です。
4. クォーテーションの使い分け:シングルとダブルの違い
変数を扱う上で初心者が迷いやすいのが、'(シングルクォーテーション)と"(ダブルクォーテーション)の使い分けです。どちらも文字列を囲むために使われますが、その性質は大きく異なります。
ダブルクォーテーションで囲った場合、その中の変数は展開され、中身が表示されます。一方、シングルクォーテーションで囲むと、中の文字列は「そのままの文字」として扱われ、変数の展開は行われません。これを「エスケープ」と呼ぶこともあります。コマンドの結果をそのまま保持したいのか、あるいは中身を処理したいのかによって使い分ける必要があります。
price=100
echo "価格は ${price}円です"
価格は 100円です
echo '価格は ${price}円です'
価格は ${price}円です
このように、シングルクォーテーションを使うと変数の値が表示されず、文字としての「$price」がそのまま出てきます。パスワードや、記号をそのまま扱いたい特殊な文字が含まれる場合にシングルクォーテーションを利用します。
5. 数値計算を行う方法とexprコマンド
シェル変数はデフォルトでは「文字列」として扱われます。そのため、単にnum=1+1としても、計算結果の「2」ではなく「1+1」という文字が保存されてしまいます。Linux(リナックス)で数値計算(スウチケイサン)を行いたい場合は、特別な書き方が必要です。
代表的な方法として、$(( ))という二重の括弧を使う形式や、exprコマンドを使う形式があります。現代のBash(バッシュ)においては、可読性が高く高速な$(( ))を使うのが一般的です。
num1=10
num2=20
total=$((num1 + num2))
echo $total
30
この計算機能を使えば、スクリプト内でループの回数を数えたり、ファイルの合計サイズを算出したりといった複雑な処理が可能になります。四則演算(シソクエンザン)である足し算、引き算、掛け算、割り算のほか、余りを求める計算も可能です。
6. シェル変数と環境変数の違いを知ろう
変数には、大きく分けて「シェル変数」と「環境変数(カンキョウヘンスウ)」の2種類が存在します。初心者の方はこの違いで混乱することが多いですが、影響範囲の違いだと考えると分かりやすいです。
シェル変数は、現在操作しているそのターミナルの画面(プロセス)の中だけで有効な変数です。一度画面を閉じたり、別のシェルを起動したりすると消えてしまいます。対して、環境変数は、そのシェルから起動される他のプログラムやスクリプトにも引き継がれる変数です。
シェル変数を環境変数に格上げするには、export(エクスポート)コマンドを使用します。これにより、自分で設定した変数をシステム全体(またはそのユーザーが動かす全プログラム)で利用できるようになります。
MY_DATA="Secret"
export MY_DATA
env | grep MY_DATA
MY_DATA=Secret
envコマンドを使うと、現在設定されている環境変数の一覧を表示できます。重要な設定情報の共有などには環境変数が使われます。
7. コマンドの実行結果を変数に代入するコマンド置換
「現在の時刻」や「カレントディレクトリ名」など、コマンドを実行して得られた結果を変数に保存したい場合があります。これをコマンド置換(コマンドチカン)と呼びます。
コマンド置換を行うには、コマンドを$( )で囲みます。昔はバッククォート「`」が使われていましたが、入れ子(ネスト)構造にしやすい「$()」を使うのが現在の主流です。これを使うと、スクリプトの柔軟性が一気に高まります。
current_dir=$(pwd)
echo "現在の場所は ${current_dir} です"
現在の場所は /home/user です
例えば、ログファイルのファイル名に日付を入れたいときなどは、today=$(date +%Y%m%d)のようにして日付を取得し、変数として利用するのが定番の手法です。手動で入力する手間を省き、ミスのない運用を実現できます。
8. 特殊変数と位置パラメータの基本
Bash(バッシュ)には、ユーザーが定義しなくても最初から役割が決まっている特殊変数(トクシュヘンスウ)が存在します。特にシェルスクリプトを作成する際に欠かせないのが「位置パラメータ(イチパラメータ)」です。
スクリプトを実行する際に後ろに付けた引数(引数:ヒキスウ)は、自動的に「$1」「$2」「$3」といった変数に格納されます。また、実行したコマンド自体は「$0」に格納されます。さらに、直前に実行したコマンドが成功したかどうかを判定する$?という非常に重要な変数もあります。
ls /exists_folder
echo $?
0
もしコマンドが成功すれば「0」が、失敗すれば「0以外」が返ってきます。これをチェックすることで、エラーが発生したときに処理を中断するといった制御が可能になります。Linux(リナックス)管理において、この終了ステータスの確認はプロレベルの運用には必須の知識です。
9. 変数を削除する方法とreadonly設定
使い終わった変数をメモリから解放したい、あるいは定義自体を消したい場合にはunset(アンセット)コマンドを使用します。これにより、定義されていない状態に戻すことができます。
逆に、重要な設定が入った変数を誤って上書きしたり消したりしたくない場合には、readonly(リードオンリー)設定を行います。これは日本語で「読み取り専用(ヨミトリセンヨウ)」という意味で、一度設定すると値を変更できなくなります。
readonly OS_NAME="Linux"
OS_NAME="Windows"
-bash: OS_NAME: 読み取り専用変数です
システム全体で共有する定数や、スクリプト内で変更されては困る重要なパスなどは、このように保護しておくことで安全性を高めることができます。初心者のうちはあまり使いませんが、大規模なシェルスクリプトを書く際にはバグを防ぐ強力な武器になります。
10. シェル変数を活用した実践的なヒント
変数の基本を理解したら、実際の作業でどう役立つかを考えてみましょう。最も多い活用法は、パスの簡略化です。深い階層にあるディレクトリへの移動やファイルのコピーは大変ですが、変数を使えば一瞬です。
また、シェルスクリプトの中では、共通の設定(バックアップ先のフォルダ名や、保存期間の数値など)を変数として冒頭にまとめて記述するのが一般的です。こうすることで、後から設定を変更したくなったときに、コードの中身をすべて書き換える必要がなくなり、一番上の変数定義を1箇所変えるだけで済むようになります。これを「保守性(ホシュセイ)を高める」と言います。
Linux(リナックス)を使いこなす第一歩は、こうした小さな工夫の積み重ねです。変数を自由に操れるようになると、コマンドラインでの操作がまるで魔法のようにスムーズになります。まずは自分の名前や今日の日付を代入して表示させるところから、たくさん練習してみてください。
LPICレベル1の合格を目指している人や、 Linuxコマンド・シェル・ネットワーク・セキュリティの試験対策を効率よく進めたい人におすすめの定番問題集です。
Linux教科書 LPICレベル1 スピードマスター問題集を見る※ Amazonアソシエイト広告リンク
まとめ
今回の記事では、Linux(リナックス)のコマンドライン操作において欠かせないシェル変数(シェルヘンスウ)の基礎から応用までを詳しく解説しました。Bash(バッシュ)などのシェル環境で変数を使いこなすことは、単純なタイピング作業の削減だけでなく、システム管理の自動化やシェルスクリプト作成における極めて重要なステップです。変数は「値を一時的に保存する箱」であり、そこに適切な名前を付けて管理することで、複雑なパスや計算結果、コマンドの出力結果を効率的に再利用できるようになります。
シェル変数活用の重要ポイント再確認
これまでに学んだ内容を振り返り、特に間違いやすいポイントを整理しておきましょう。
- 代入のルール:
name=valueのように、イコールの前後にスペースを入れないこと。 - 参照のルール: 変数の中身を取り出すときは、変数名の頭に
$を付けること。 - 展開のコツ: 文字列の中で変数を使うときは
${name}と括弧で囲むと誤動作を防げる。 - 引用符の違い: ダブルクォーテーションは変数を展開し、シングルクォーテーションは文字列としてそのまま扱う。
- 有効範囲: シェル変数は現在のセッションのみ、環境変数は
exportすることで子プロセスにも引き継がれる。
実戦で役立つシェルスクリプトのサンプル
これまでの知識を組み合わせて、実践的な短いスクリプトを作成してみましょう。以下のコードは、バックアップ作業を想定した変数活用の例です。変数を冒頭に定義することで、メンテナンス性が非常に高まっています。
#!/bin/bash
# バックアップ元のディレクトリと保存先を変数で定義
src_dir="/home/user/documents"
backup_dir="/backup/archive"
today=$(date +%Y%m%d)
# ファイル名に日付変数を含める
backup_file="backup_${today}.tar.gz"
# メッセージの表示(変数展開を活用)
echo "現在、${src_dir} のデータをバックアップしています..."
# 実際の処理(ここでは例としてechoを使用)
echo "コマンド実行:tar -czf ${backup_dir}/${backup_file} ${src_dir}"
# 終了ステータスの確認
if [ $? -eq 0 ]; then
echo "バックアップは正常に完了しました。"
else
echo "エラーが発生しました。確認してください。"
fi
このように、ディレクトリパスやファイル名を直接コマンドの中に書き込むのではなく、変数として一箇所にまとめるのが「プロの書き方」です。もし保存先が変わっても、一箇所の修正で済みます。
数値計算とコマンド置換の高度な利用
さらに、システム運用では数値計算やコマンドの結果を動的に取得する場面が多くあります。例えば、ディスクの使用量を確認して変数に入れ、その値に基づいて条件分岐をさせるといった自動化が可能です。
# ディスク使用率(%)を取得して変数に代入
usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
echo "現在のディスク使用率は ${usage}% です。"
# 80%を超えているか計算(二重括弧を使用)
if [ $usage -gt 80 ]; then
echo "警告:ディスク容量が不足しています!"
fi
Linux(リナックス)を自由自在に操るためには、こうした変数の組み合わせを試行錯誤することが一番の近道です。最初は echo で値を表示させるだけの簡単な操作から始め、徐々に条件分岐やループ処理へとステップアップしていきましょう。Bash(バッシュ)の強力な変数機能をマスターすれば、退屈な定型作業はすべてコンピュータに任せることができるようになります。
生徒
「先生、まとめまで読んでみて、変数の使い道が具体的によく分かりました!特に $(( )) を使った計算や、$( ) でコマンドの結果を変数に入れる方法は、色々な自動化に使えそうですね。」
先生
「その通りです!よく理解できましたね。最初は単なる文字列の保存だけに見えますが、プログラムの結果を変数に格納できるようになると、スクリプトの柔軟性が劇的に向上するんですよ。ちなみに、一番注意すべきポイントは何でしたか?」
生徒
「はい、やっぱり『イコールの前後にスペースを入れない』ことと、『表示するときは $ を付ける』ことですね。さっき試してみたら、スペースを入れただけでエラーになってびっくりしました。」
先生
「そう、シェルは非常に厳格なんです。でも、そのルールさえ守れば、強力な武器になります。位置パラメータの $1 や $2 を使えば、引数を受け取る便利なツールも自作できるようになりますよ。」
生徒
「$? でコマンドが成功したか確認するのも、エラーチェックには欠かせないですね。これからシェルスクリプトをどんどん書いて、作業を効率化してみたいと思います!」
先生
「素晴らしい意気込みですね!環境変数の export も、開発環境の設定などで頻繁に出てくるので、忘れたときはこの記事を読み返してください。Linux(リナックス)マスターを目指して頑張りましょう!」