Linuxシステム操作の基本:ファイル管理、ネットワーク、ストレージ、パッケージ管理、シェルスクリプト

1. Linuxファイル管理

1.1. touchコマンド

touchコマンドは、新しいファイルを生成したり、既存のファイルやディレクトリのタイムスタンプ(最終アクセス時刻や最終変更時刻)を更新したりするために使用されます。ファイルが存在しない場合は、新しい空のファイルが作成されます。

ファイルのタイムスタンプは ls -l コマンドで確認できます。

利用可能なユーザー: 全てのユーザー

構文

touch [-acfm][-d<日時>][-r<参照ファイルまたはディレクトリ>] [-t<日時>][--help][--version][ファイルまたはディレクトリ…]
  • -a: ファイルの最終アクセス時刻のみを変更します。
  • -m: ファイルの最終変更時刻のみを変更します。
  • -c: 指定されたファイルが存在しない場合でも、新しいファイルを作成しません。
  • -r <参照ファイル>: 参照ファイルのタイムスタンプを適用します。
  • -d <日時>: 指定された日時でタイムスタンプを設定します。
  • -t <日時>: dateコマンドと同じ形式でタイムスタンプを設定します。

空ファイルの作成

touchコマンドを使って、シンプルな空ファイルを作成するには、ファイル名を指定します。

touch my_document.txt

ファイルが作成されたことを確認します。

ls -l my_document.txt

複数の空ファイルの一括作成

複数の空ファイルを同時に作成する必要がある場合、touchコマンドで簡単に実現できます。

touch project_data_{1..5}.txt

この例では、project_data_1.txtからproject_data_5.txtまでの5つの空ファイルが作成されます。必要に応じてファイル名や数を変更できます。

作成されたファイルを確認します。

ls -l

ファイルのアクセス時刻の更新

my_document.txtの最終アクセス時刻を更新したい場合、touchコマンドに-aオプションを使用します。

まず、現在のタイムスタンプを確認します。

ls -l my_document.txt

次に、touchコマンドを実行してタイムスタンプを更新します。

touch -a my_document.txt

再度 ls -l で確認すると、アクセス時刻が更新されていることがわかります。

ls -l my_document.txt

より詳細なファイル情報、特にアクセス、変更、ステータス変更時刻を確認するには、statコマンドが便利です。

stat my_document.txt

statコマンドについて

statコマンドは、指定されたファイルまたはディレクトリのinode情報を詳細に表示します。これには、ファイルサイズ、ブロック数、パーミッション、所有者、グループ、アクセス時刻、変更時刻、ステータス変更時刻などが含まれます。

構文

stat [ファイルまたはディレクトリ]

1.2. viおよびvimコマンド

1.2.1. vi/vimの概要

vi/vimはLinux環境における強力なテキストエディタです。Windowsのメモ帳やWordのようなグラフィカルな操作とは異なり、コマンドラインベースでテキストファイルの作成、編集、保存を行います。

viについて:

  • "visual interface"の略で、Linuxで最も古く、広く使われているテキストエディタの一つです。
  • テキスト内容の編集に特化しており、フォントや段落のレイアウト機能はありません。
  • マウス操作をサポートせず、メニューもありません。全てコマンドで操作します。
  • システム管理やサーバー管理における設定ファイルの編集で、その機能はグラフィカルエディタを凌駕します。

vimについて:

  • viの進化版であり、「Vi IMproved」の略です。
  • コード補完、コンパイル、エラーへのジャンプなど、プログラミングに便利な機能が豊富に備わっており、開発者の間で広く利用されています。
  • viが基本的な機能を備えた古いワープロだとすれば、vimはプログラム開発者にとって非常に役立つツールです。

1.2.2. vi/vimのモード

vi/vimには主に以下の3つのモードがあります。

コマンドモード(ノーマルモード):
Linuxターミナルでvim ファイル名と入力するとこのモードに入ります。文字入力はできませんが、ファイルの移動、コピー、削除などの操作コマンドを実行できます。
挿入モード(編集モード):
コマンドモードでiキーを押すと挿入モードに入ります。このモードではテキストの入力、編集が可能です。Escキーを押すとコマンドモードに戻ります。
Exモード(最終行モード):
コマンドモードで:(コロン)キーを押すとExモードに入ります。画面の左下部にコロンが表示され、ファイル保存、終了、検索、置換などのコマンドを実行できます。

これらのモードは以下のように遷移します。

  • vim起動時はコマンドモードです。
  • コマンドモードからiaoなどのキーで挿入モードに入ります。
  • 挿入モードからEscキーでコマンドモードに戻ります。
  • コマンドモードから:キーでExモードに入ります。

1.2.3. ファイルのオープンと新規作成

vimは既存のファイルを開くだけでなく、存在しないファイルを指定した場合、保存時に新しいファイルとして作成します。

利用可能なユーザー: 現在のファイルのパーミッションを持つユーザー

  • ターミナルでvimの後にファイル名を続けます。
vim document_edit.txt
  • ファイルが存在すれば直接開かれます。
  • ファイルが存在しなければ、保存・終了時に新しいファイルとして作成されます。

1.2.4. モードの切り替えと基本操作

1. コマンドモードへの移行

ファイルを開くか新規作成する際に、以下のコマンドでコマンドモードに入ります。

vim document_edit.txt

2. 挿入モードへの移行

コマンドモードからテキストを編集するためには挿入モードに入ります。iキーが最も一般的ですが、他にも複数の方法があります。

コマンド 機能
i カーソル位置の前にテキストを挿入します。
I 現在の行の先頭にテキストを挿入します。
a カーソル位置の後にテキストを追加します。
A 現在の行の末尾にテキストを追加します。
o 現在の行の下に新しい空行を挿入します。
O 現在の行の上に新しい空行を挿入します。

挿入モードに入ると、画面の左下部に「INSERT」または「挿入」と表示されます。

3. Exモードとファイルの保存・終了

挿入モードではファイルを保存できません。まずEscキーを押してコマンドモードに戻ります。次に:キーを押してExモードに入ります。

Exモードでは以下のコマンドが利用できます。

  • :q: ファイルの内容に変更がない場合、vimを終了します。
  • :q!: ファイルに変更があっても保存せずに終了します。
  • :wq: 変更を保存して終了します。
  • :wq!: 強制的に保存して終了します(主にrootユーザーやファイル所有者に限られます)。
  • :w: 変更を保存します(終了はしません)。

1.2.5. ファイル内容の表示

Linuxでは、以下のようなコマンドを使ってファイルの内容を確認できます。各コマンドには異なる用途と表示方法があります。

コマンド 用途 説明
cat ファイル名 小規模ファイルの表示 ファイル内容全体を一度に表示します。
less -N ファイル名 大規模ファイルのページング表示 ファイル内容をページごとに表示し、効率的に閲覧できます。
head -n ファイル名 ファイル先頭部分の表示 ファイルの先頭数行を表示します(デフォルトは10行)。
tail -n ファイル名 ファイル末尾部分の表示 ファイルの末尾数行を表示します(デフォルトは10行)。
grep キーワード ファイル名 キーワード検索 ファイル内で指定されたキーワードを含む行を検索・表示します。

1. catコマンド

catは、テキストファイルを表示および連結するためのコマンドです。比較的小さなファイルの内容全体を素早く確認するのに適しています。

利用可能なユーザー: 現在のファイルのパーミッションを持つユーザー

構文

cat [-AbeEnstTuv] [--help] [--version] ファイル名

document_edit.txtファイルの内容を表示します。

cat document_edit.txt

document_edit.txtファイルの内容を行番号付きで表示します。

cat -n document_edit.txt

2. grepコマンド

grepコマンドは、指定されたパターンに一致する行をファイルから検索して表示します。この機能は、Windowsでのテキストエディタの「検索」機能や、タスクマネージャーでのプロセス検索に似ています。

利用可能なユーザー: 現在のファイルのパーミッションを持つユーザー

構文

grep [-abcEFGhHilLnqrsvVwxy][-A<表示行数>][-B<表示行数>][-C<表示行数>][-d<動作>][-e<パターン>][-f<パターンファイル>][--help][パターン][ファイルまたはディレクトリ...]

ここでは、document_edit.txtというファイルに以下の内容が記述されていると仮定します。

First line of text
second line with keyword
Third line is unique
Another line with KEYWORD
End of document

キーワード「keyword」を含む行を検索します。

grep keyword document_edit.txt

キーワード「keyword」を含む行を行番号付きで検索します。

grep -n keyword document_edit.txt

大文字と小文字を区別せずにキーワード「KEYWORD」を含む行を検索します。

grep -i KEYWORD document_edit.txt

キーワード「unique」を含まない行を検索します。

grep -v unique document_edit.txt

特定のプロセス情報を検索します(grep自身のプロセスを除く)。例えば、sshdプロセスを探す場合。

ps aux | grep sshd | grep -v "grep"

これは、ps auxで全てのプロセスを表示し、それをgrep sshdsshdを含む行に絞り込み、さらにgrep -v "grep"grepコマンド自身を除外しています。

プロセスの数をカウントします。

ps -ef | grep -c sshd

この結果にはgrepコマンド自身のプロセスも含まれる可能性があるため、正確なプロセス数を知るには前述のgrep -v "grep"を使用するのがより確実です。

3. tailコマンド

tailコマンドは、ファイルの末尾部分を表示するのに利用されます。特に、更新され続けているログファイルなどをリアルタイムで監視する際に-fオプションが非常に便利です。

利用可能なユーザー: 現在のファイルのパーミッションを持つユーザー

構文

tail [オプション] [ファイル]

document_edit.txtファイルの末尾2行を表示します。

tail -2 document_edit.txt

log_file.logファイルの末尾内容を動的に表示し、ファイルが更新されるたびに新しい行を追加表示します(ログ監視に最適)。停止するにはCtrl+Cを押します。

tail -f log_file.log

ファイルの先頭から2行目以降の全ての内容を表示します。

tail -n +2 document_edit.txt

ファイルの末尾20バイト(文字)を表示します。

tail -c 20 document_edit.txt

4. lessコマンド

lessコマンドは、大規模なテキストファイルを効率的に閲覧するためのページャーです。ファイル全体をメモリにロードしないため、非常に大きなファイルでも高速に開くことができます。

利用可能なユーザー: 現在のファイルのパーミッションを持つユーザー

構文

less [オプション] ファイル

document_edit.txtファイルの内容を表示します。

less document_edit.txt

コマンド履歴をlessでページング表示します。

history | less

lessモードでは以下の操作が可能です。

  • j または : 1行下に移動
  • k または : 1行上に移動
  • G: ファイルの最終行に移動
  • g: ファイルの先頭行に移動
  • Space または Ctrl + F: 1画面分下にスクロール
  • b または Ctrl + B: 1画面分上にスクロール
  • d または Ctrl + D: 半画面分下にスクロール
  • u または Ctrl + U: 半画面分上にスクロール
  • /パターン: パターンを検索 (nで次の一致、Nで前の一致)
  • q または ZZ: lessを終了

1.2.6. vimでの特定行への移動

vimでファイルを開き、特定の行に直接移動したい場合、以下のコマンドを使用します。これは、エラーログなどで特定の行番号が示されている場合に非常に便利です。

例えば、document_edit.txtファイルを開き、6行目に移動します。

vim document_edit.txt +6

1.2.7. vimの異常終了と回復

vimが予期せず終了した場合、作業中のファイルの「スワップファイル」(通常は.swp拡張子を持つ)がディスク上に残ることがあります。次に同じファイルをvimで開こうとすると、このスワップファイルが存在することを警告するメッセージが表示されます。

解決策:

警告が表示された場合、通常は以下のいずれかのオプションを選択します。

  • R (Recover): スワップファイルから内容を回復します。
  • D (Delete): スワップファイルを削除します。
  • Q (Quit): vimを終了します。

回復が必要ない場合、最も一般的な解決策は、警告メッセージが表示された後にDオプションを選択するか、手動でスワップファイルを削除することです。ファイル名は.ファイル名.swpの形式になります。

rm .document_edit.txt.swp

スワップファイルを削除すれば、次回から警告なしでファイルを編集できます。

1.2.8. vimの拡張操作

vi/vimを効率的に使用するためには、コマンドモードでのカーソル移動やテキスト編集コマンドを習得することが重要です。これらのコマンドは組み合わせて使用することで、より複雑な操作を素早く実行できます。

1. カーソル移動(上下左右)

コマンド 機能
h 左へ移動
j 下へ移動
k 上へ移動
l 右へ移動

キーボードの矢印キーも利用できますが、h, j, k, lを覚えるとホームポジションから手を動かさずに操作できます。

2. 行内移動

コマンド 機能
w 次の単語の先頭へ移動
b 前の単語の先頭へ移動
0 行の先頭へ移動(空白文字を含む)
^ 行の先頭の非空白文字へ移動
$ 行の末尾へ移動

3. 行番号移動

コマンド 機能
gg ファイルの先頭行へ移動
G ファイルの最終行へ移動
数字ggまたは数字G 指定した行番号へ移動
:数字 指定した行番号へ移動

4. 画面移動

コマンド 機能
Ctrl + b 1画面分上にスクロール
Ctrl + f 1画面分下にスクロール
H 画面の最上行へ移動
M 画面の中央行へ移動
L 画面の最下行へ移動

5. テキスト選択(ビジュアルモード)

テキストのコピーや削除の前に、まず選択方法を覚える必要があります。vi/vimでは、vキーでビジュアルモードに切り替えることで、テキストを選択できます。Escキーでコマンドモードに戻り、選択を解除します。

コマンド モード 機能
v ビジュアルモード カーソル位置から文字単位で選択します。
V ビジュアルラインモード カーソル行全体を一度に選択します。
Ctrl + v ビジュアルブロックモード 矩形選択を行います。

6. 元に戻す(Undo)とやり直す(Redo)

誤った編集操作をしてしまった場合に役立つ重要なコマンドです。

コマンド 機能
u 直前の変更を元に戻す(Undo)
Ctrl + r 元に戻した変更をやり直す(Redo)

7. テキストの削除

コマンド 機能
x カーソル位置の文字、または選択した文字を削除
d(移動コマンド) 移動コマンドに対応する範囲を削除
dd カーソル行を削除(nddでn行削除)
D カーソル位置から行末まで削除

ビジュアルモードでテキストを選択後、dまたはxを押すことで選択範囲を削除できます。

dコマンドと移動コマンドの組み合わせ例:

  • dw: カーソル位置から単語の末尾まで削除
  • d}: カーソル位置から段落の末尾まで削除
  • ndd: カーソル行から下にn行削除

8. コピー(Yank)と貼り付け(Paste)

vi/vimにはコピーしたテキストを一時的に保持するバッファがあります。

コマンド 機能
yy 現在の行をコピー(nyyでn行コピー)
d (カット) 選択範囲をカット
dd (カット) 現在の行をカット(nddでn行カット)
p カーソル位置の後に貼り付け(大文字Pで前に貼り付け)

dxコマンドは、GUIの「切り取り」(Ctrl+X)に、yコマンドは「コピー」(Ctrl+C)に似ています。pコマンドは「貼り付け」(Ctrl+V)に似ています。

注意: vi/vimのテキストバッファは一つだけです。新しいコピーや切り取り操作を行うと、以前のバッファ内容は上書きされます。

また、vi/vimのテキストバッファは、システムのクリップボードとは異なります。他のアプリケーションでCtrl+Cでコピーした内容は、vipコマンドで貼り付けることはできません。挿入モードでマウスの右クリックメニューから貼り付けることは可能です。

9. 置換(Replace)

vimの置換コマンドは、挿入モードに入らずにテキストを修正するのに便利です。

コマンド 機能 モード
r カーソル位置の単一文字を置換 コマンドモード
R コマンドモードから置換モードに入り、カーソル位置から文字を上書きします。Escでコマンドモードに戻ります。 置換モード

10. インデントとコマンドの繰り返し

コマンド 機能
>> 現在の行を右にインデントします。
<< 現在の行を左にインデントします。
. 直前のコマンドを繰り返します。

ビジュアルモードでテキストを選択してから>または<を押すと、選択範囲全体をインデントできます。

11. 検索(Search)

通常の検索:

コマンド 機能
/文字列 指定した文字列を前方検索します。
?文字列 指定した文字列を後方検索します。

検索後、nで次の一致、Nで前の一致に移動します。検索結果のハイライト表示を消すには、ファイルに存在しない文字列を検索します。

単語の高速検索:

コマンド 機能
* カーソル位置の単語を前方検索します。
# カーソル位置の単語を後方検索します。

開発中に、この機能を使って特定の単語がどこで使われているかを素早く確認できます。

12. 検索と置換

vi/vimでの検索と置換はExモード(最終行モード)で実行します。

コマンドの基本形式:

:%s/旧テキスト/新テキスト/g
1. 全体置換

ファイル内の全ての「旧テキスト」を「新テキスト」に置換します。

:%s/old_text/new_text/g
2. 選択範囲内の置換

まず、ビジュアルモードで置換したいテキスト範囲を選択します。その後、以下のコマンドを実行します。

:s/old_text/new_text/g

選択範囲内でのみ置換が実行されます。

3. 確認付き置換

置換の際に、各変更をインタラクティブに確認したい場合は、gの代わりにgcを使用します。

:%s/old_text/new_text/gc

このコマンドを実行すると、各置換候補に対して以下の選択肢が表示されます。

  • y: 置換を実行します (yes)
  • n: 置換をスキップします (no)
  • a: 全て置換します (all)
  • q: 置換を中止します (quit)
  • l: 最後のマッチを置換し、行の先頭に移動します (last)
  • Ctrl+E: 下にスクロール
  • Ctrl+Y: 上にスクロール

1.3. echoコマンド

echoコマンドは、指定された文字列を標準出力(通常はコンソール)に表示します。JavaのSystem.out.print()のようなものですが、ファイルへの出力(リダイレクト)にも使われます。

利用可能なユーザー: 全てのユーザー

文字列をコンソールに出力します。

echo Hello, Linux!

文字列にスペースが含まれる場合、曖昧さを避けるために二重引用符または単一引用符を使用します。

echo "Hello, Linux World!"

出力リダイレクト:> (上書き) と >> (追記)

デフォルトでは、コマンドの実行結果はコンソールに表示されますが、リダイレクト機能を使用することで、その結果をファイルに出力できます。

1. コマンドの成功結果をファイルに上書き保存

>記号を使用すると、指定したファイルにコマンドの出力が書き込まれます。ファイルが既に存在する場合、既存の内容は全て上書きされます。ファイルが存在しない場合は新規作成されます。

echo "First line of text" > output.txt
cat output.txt

このコマンドを実行すると、output.txtには「First line of text」のみが記述されます。

2. コマンドの成功結果をファイルに追記

>>記号を使用すると、コマンドの出力が指定したファイルの末尾に追加されます。既存の内容は保持されます。

echo "Second line added" >> output.txt
cat output.txt

output.txtには「First line of text」に続いて「Second line added」が追加されます。

3. コマンドの失敗結果(エラー出力)をファイルに追記

エラー出力(標準エラー出力、ファイルディスクリプタ2)もファイルにリダイレクトできます。2>>を使用します。

cat nonexistent_directory 2>> error.log

nonexistent_directoryという存在しないディレクトリをcatしようとするとエラーが発生し、そのエラーメッセージがerror.logに追記されます。

成功出力とエラー出力を区別せずに同じファイルに追記したい場合は、&>>を使用します。

cat nonexistent_directory &>> combined.log
echo "Successful output example" &>> combined.log
cat combined.log

これにより、エラーメッセージも通常の出力もcombined.logに追記されます。

1.4. awkコマンド

awkは、テキストファイルを処理するための強力なスクリプト言語であり、テキスト解析ツールです。その名前は、三人の創始者 Alfred Aho、Peter Weinberger、Brian Kernighan の姓の頭文字から取られています。

awkは、ファイルを1行ずつ読み込み、デフォルトで空白文字を区切り文字として行をフィールド(列)に分割し、それぞれのフィールドに対して様々な処理を行います。

構文

awk [オプションパラメータ] 'スクリプト' 変数=値 ファイル(複数可)
または
awk [オプションパラメータ] -f スクリプトファイル 変数=値 ファイル(複数可)

例1: 特定のキーワードを含む行の検索

以下のstudents.txtというファイルがあると仮定します。

Alice 85 90 78
Bob 70 65 80
Charlie 92 88 95
David 60 72 68
Eve 75 80 82

「Alice」または「Eve」という名前の学生の行を検索します。

cat students.txt | awk '/Alice|Eve/'

例2: 区切り文字を指定してフィールドを表示

awk-Fオプションでフィールド区切り文字を指定し、$NでN番目のフィールドを取得できます。$0は行全体、NFはフィールド数、$NFは最後のフィールドを表します。

オプション/変数 意味
-F '区切り文字' フィールド区切り文字を指定します。
$数字 指定した番号のフィールドを取得します。
$0 現在の行全体を取得します。
NF 現在の行のフィールド(列)の総数を表します。
$NF 最後のフィールドを取得します。
$(NF-1) 最後から2番目のフィールドを取得します。
NR 現在処理している行番号を表します。

students.txtファイルで、空白を区切り文字として1番目、2番目、3番目のフィールドを表示します。

cat students.txt | awk -F ' ' '{print $1, $2, $3}'

例3: 出力フィールド区切り文字(OFS)の指定

出力時のフィールド区切り文字はOFS変数で変更できます。これは、BEGINブロック、または各行の処理ブロック内で設定できます。

オプション/変数 意味
OFS="文字" 出力時のフィールド区切り文字列を設定します。

空白区切りで1番目、2番目、3番目のフィールドを表示し、それらを「---」で区切って出力します。

cat students.txt | awk -F ' ' '{OFS="---"}{print $1, $2, $3}'

タブ文字で区切って出力する例。

cat students.txt | awk -F ' ' '{OFS="\t"}{print $1,$2,$3}'

例4: awkの組み込み関数の利用

awkは様々な組み込み関数を提供しており、文字列操作などを行うことができます。

関数名 意味
toupper(文字列) 文字列を大文字に変換します。
tolower(文字列) 文字列を小文字に変換します。
length(文字列) 文字列の長さを返します。

students.txtの1番目のフィールド(名前)を大文字に変換して表示します。

cat students.txt | awk -F ' ' '{print toupper($1)}'

例5: 平均点の計算

awkBEGINブロック(処理開始前)、メインブロック(各行処理)、ENDブロック(処理終了後)を使って複雑な計算も行えます。

BEGIN{初期化操作} {各行で実行する処理} END{終了時の操作}

students.txtの各学生の3番目の科目(78, 80, 95, 68, 82)の合計点、人数、平均点を計算します。

cat students.txt | awk -F ' ' 'BEGIN {total_score=0} {total_score+=$4} END {print "合計点:", total_score, "人数:", NR, "平均点:", (total_score/NR)}'

このコマンドでは、$4が4番目のフィールド(この例では3番目の科目点数)を指します。
(補足:元の例のデータで計算すると $2,$3,$4 と科目が増えていくため $4 が適当です)
出力例: 合計点: 403 人数: 5 平均点: 80.6

1.5. シンボリックリンク

シンボリックリンク(またはソフトリンク、シンボリックリンク)は、Windowsの「ショートカット」に似ています。これは、ファイルシステム内の別のファイルやディレクトリへの参照を作成するものです。

Linuxでは、ファイル名とファイルの内容は異なる概念です。シンボリックリンクは、元のファイルへのパスを指し示すだけで、実際のデータは含まれません。

特に、深くネストされたパスにあるファイルやディレクトリに簡単にアクセスするために利用されます。

利用可能なユーザー: 全てのユーザー

構文

コマンド 機能
ln -s 対象ファイルの絶対パス ショートカットパス 対象ファイルへのシンボリックリンクを作成します。

例えば、/home/user/original_report.txtというファイルにreport_linkというシンボリックリンクを作成します。

ln -s /home/user/original_report.txt report_link

これにより、report_linkという名前でoriginal_report.txtにアクセスできるようになります。

cat report_link

report_linkファイルを削除しても、元のoriginal_report.txtファイルは影響を受けません。

1.6. findコマンド

findコマンドは、指定されたディレクトリとそのサブディレクトリ内で、特定の条件に一致するファイルやディレクトリを検索するために使用されます。引数を指定せずに実行すると、現在のディレクトリ以下の全てのファイルとディレクトリを表示します。

構文

find <検索開始ディレクトリ> <検索条件> <アクション>

利用可能なユーザー: 全てのユーザー

例1: 特定の拡張子のファイルを検索

現在のディレクトリとそのサブディレクトリ内で、拡張子が.logの全てのファイルを検索します。

find . -name "*.log"

例2: 特定の期間内に更新されたファイルを検索

現在のディレクトリとそのサブディレクトリ内で、過去24時間以内に変更されたファイルを検索します。

find . -ctime -1

-ctime -1は、最終変更時刻 (change time) が1日以内(つまり過去24時間以内)のファイルを検索します。

例3: 全システムから特定の名前を検索

ルートディレクトリ(/)から、「my_project」という名前のファイルまたはディレクトリを検索します。検索範囲は指定したディレクトリに限定できます。

find / -name 'my_project'

1.7. readコマンド

readコマンドは、標準入力から1行分のデータを読み取るために使用されます。これにより、シェルスクリプトはユーザーからのキーボード入力や、リダイレクトされたファイルの内容を動的に受け取ることができます。

利用可能なユーザー: 全てのユーザー

構文

read [-ers] [-a 配列名] [-d 区切り文字] [-i 初期テキスト] [-n 文字数] [-N 文字数] [-p プロンプト] [-t タイムアウト秒数] [-u ファイルディスクリプタ] [変数名 ...]

例1: ユーザーからの簡単な入力読み取り

以下のシェルスクリプトは、ユーザーにサイト名の入力を促し、その入力された値を表示します。

#!/bin/bash
echo "ウェブサイト名を入力してください: "  
read site_name  
echo "あなたが入力したウェブサイト名は $site_name です"  
exit 0

スクリプトを実行すると、プロンプトが表示され、入力した内容がsite_name変数に格納されて表示されます。

例2: ファイルからの行ごとの読み取り

readコマンドは、ファイルから1行ずつデータを読み取るのにも使用できます。ファイルから読み取る行がなくなると、readコマンドはゼロ以外の終了ステータスで終了します。

以下のconfig.txtというテストファイルがあると仮定します。

OPTION_A=value1
OPTION_B=value2
OPTION_C=value3
# Commented line
KEY=important_data

このファイルを1行ずつ読み取り、各行の内容と行番号を表示するシェルスクリプトを作成します。

#!/bin/bash
line_count=1
cat config.txt | while read current_line      
do
   echo "行 $line_count: $current_line"
   line_count=$(( line_count + 1 )) # 中括弧内のスペースに注意
done
echo "処理完了"
exit 0

このスクリプトでは、cat config.txtの出力がwhile read current_lineループにパイプで渡され、readコマンドが各行をcurrent_line変数に格納します。その後、行番号と共に内容が表示されます。

2. Linuxバックアップと圧縮

Windows環境で大きなファイルを圧縮する際、Zip形式などの専用ツールを利用するのと同様に、Linuxでも様々なコマンドを用いて圧縮・解凍操作を行うことができます。

2.1. gzipコマンド

gzipコマンドはファイルを圧縮するために広く利用されているプログラムです。圧縮されたファイルには通常.gzという拡張子が追加されます。gzipはディレクトリを直接圧縮することはできませんが、tarコマンドと組み合わせることでディレクトリの圧縮が可能です。

利用可能なユーザー: 全てのユーザー

構文

gzip [オプション] [ファイル]

例1: 複数のファイルを圧縮

まず、テスト用のディレクトリを作成し、その中にいくつかの空ファイルを用意します。

mkdir compress_test
cd compress_test/
touch doc_a.txt doc_b.txt doc_c.txt

このディレクトリ内の全てのファイルを圧縮します。

gzip *

これにより、doc_a.txt.gzdoc_b.txt.gzdoc_c.txt.gzが作成され、元のファイルは削除されます。

例2: 圧縮ファイルの詳細情報を表示し解凍

圧縮ファイルを解凍し、その詳細情報を表示するには-dvオプションを使用します。

gzip -dv doc_a.txt.gz

このコマンドはdoc_a.txt.gzを解凍し、圧縮率などの詳細を表示します。

2.2. gunzipコマンド

gunzipコマンドは、gzipで圧縮されたファイルを解凍するためのプログラムです。多くのシステムでgzip -dと同じ機能を持ちます。

利用可能なユーザー: 全てのユーザー

構文

gunzip [オプション] [ファイル]

doc_b.txt.gzファイルを解凍します。

gunzip doc_b.txt.gz

これにより、doc_b.txtというファイルが元の場所に復元されます。

2.3. tarコマンド

tarコマンドは、複数のファイルやディレクトリを一つのアーカイブファイルに「パック」(まとめる)する主要なツールです。tar自体には圧縮機能はありませんが、gzipbzip2といった圧縮ツールと連携して、アーカイブを圧縮することができます。

利用可能なユーザー: 全てのユーザー

構文

tar [必須オプション] [選択オプション] [ファイル]

主なオプション:

  • -c: 新しいアーカイブを作成します。
  • -x: アーカイブからファイルを展開します。
  • -v: 処理中のファイル名を表示します(verbose)。
  • -f: アーカイブファイル名を指定します。
  • -z: gzipで圧縮/解凍します。
  • -j: bzip2で圧縮/解凍します。
  • -J: xzで圧縮/解凍します。
  • -t: アーカイブの内容を一覧表示します。

例1: ファイルをパック(圧縮なし)

my_report.txtというファイルをarchive.tarという名前のアーカイブにまとめます。

tar -cvf archive.tar my_report.txt

-cは作成、-vは詳細表示、-fはファイル名を指定します。

例2: ファイルをgzipで圧縮しながらパック

my_report.txtファイルをgzipで圧縮しながらarchive.tar.gzというアーカイブを作成します。

tar -zcvf archive.tar.gz my_report.txt

-zオプションを追加することで、tarは内部でgzipを呼び出して圧縮を行います。通常、このようなファイルは.tar.gzまたは.tgzの拡張子を持ちます。

例3: アーカイブの内容を確認

archive.tar.gzの内容を一覧表示します。

tar -ztvf archive.tar.gz

-tは内容一覧表示、-zgzip圧縮ファイルを対象とします。

例4: tarアーカイブを展開

まず、展開用の新しいディレクトリを作成し、そこにアーカイブファイルをコピーします。

mkdir extracted_files
cp archive.tar.gz ./extracted_files/
cd extracted_files/

次に、archive.tar.gzファイルを現在のディレクトリに展開します。

tar -zxvf archive.tar.gz

-xは展開、-zgzip圧縮、-vは詳細表示、-fはファイル名を指定します。

2.4. zipコマンド

zipコマンドは、Windows環境でのzipファイル作成と同様に、ファイルやディレクトリを.zip形式のアーカイブに圧縮するために使用されます。多くのシステムで利用可能で、異なるOS間での互換性も高いです。

利用可能なユーザー: 全てのユーザー

構文

zip [オプション] [圧縮ファイル名] [対象ファイル/ディレクトリ...]

主なオプション:

  • -r: ディレクトリを再帰的に含めます。
  • -q: 圧縮中のメッセージを表示しません(quiet)。

例えば、project_filesというディレクトリ内に複数のファイルやサブディレクトリがあると仮定します。

mkdir project_files
cd project_files
touch item_a.txt item_b.txt
mkdir sub_dir
touch sub_dir/sub_item.txt
cd ..

このproject_filesディレクトリ全体を、my_archive.zipというファイル名で現在のディレクトリに圧縮します。

zip -q -r my_archive.zip project_files

-qで冗長な出力を抑制し、-rでディレクトリ内のファイルを再帰的に含めます。

2.5. unzipコマンド

unzipコマンドは、zip形式で圧縮されたファイルを解凍するために使用されます。Windowsでのzipファイルの展開操作と同様の機能を提供します。

利用可能なユーザー: 全てのユーザー

構文

unzip [オプション] [zipファイル]

主なオプション:

  • -l: 圧縮ファイルの内容を一覧表示します。
  • -d <ディレクトリ>: 指定されたディレクトリにファイルを解凍します。

例1: 圧縮ファイルの内容を確認

my_archive.zipファイルに含まれるファイルの一覧を表示します。

unzip -l my_archive.zip

これにより、ファイルサイズ、日付、時刻、ファイル名などの詳細情報が表示されます。

例2: 圧縮ファイルを指定ディレクトリに解凍

my_archive.zipを、現在のディレクトリ内のunzipped_dataという新しいディレクトリに解凍します。

mkdir unzipped_data
unzip -d ./unzipped_data my_archive.zip

-dオプションで展開先のディレクトリを指定します。

2.6. bzip2コマンド

bzip2コマンドは、.bz2形式のファイルを圧縮するためのツールです。gzipよりも高い圧縮率を提供することが特徴ですが、圧縮・解凍にはより時間がかかる傾向があります。要件に応じてgzipと使い分けられます。

bzip2は、ファイルを圧縮すると元のファイルを削除し、.bz2拡張子を持つ圧縮ファイルを作成します。

利用可能なユーザー: 全てのユーザー

構文

bzip2 [-cdfhkLstvVz][--repetitive-best][--repetitive-fast][- 圧縮レベル][対象ファイル]

例1: ファイルを圧縮

まず、テスト用のディレクトリを作成し、その中に空のファイルを用意します。

mkdir bzip_files
cd bzip_files
touch file_x.txt

file_x.txtを圧縮します。

bzip2 file_x.txt
ls -l

これにより、file_x.txt.bz2というファイルが作成され、元のfile_x.txtは削除されます。

2.7. bunzip2コマンド

bunzip2コマンドは、bzip2で圧縮された.bz2形式のファイルを解凍するために使用されるプログラムです。多くのシステムでbzip2 -dと同じ機能を持ちます。

利用可能なユーザー: 全てのユーザー

構文

bunzip2 [-fkLsvV][.bz2圧縮ファイル]

例1: .bz2ファイルを解凍

file_x.txt.bz2ファイルを解凍します。

bunzip2 -v file_x.txt.bz2
ls -l

-vオプションは詳細表示を有効にします。解凍後、file_x.txtが復元されます。

3. ネットワークとディスク管理

3.1. ネットワークコマンド

3.1.1. ifconfigコマンド

ifconfig(interface configurator)コマンドは、Linuxシステムにおけるネットワークインターフェースの設定表示や変更を行うために使用されます。Windowsのipconfigコマンドに似ています。

利用可能なユーザー: 表示は全てのユーザー、設定変更は管理者権限が必要です。

構文

ifconfig [ネットワークデバイス] [オプション]

例1: アクティブなネットワークインターフェースの表示

システム上の全てのアクティブなネットワークインターフェースの情報を表示します。

ifconfig

出力には、eth0ens33などの物理インターフェース、lo(ループバックインターフェース)、virbr0(仮想ブリッジ)などが表示されます。

  • ens33 (またはeth0): 最初のイーサネットカードを表します。IPアドレス、ブロードキャストアドレス、サブネットマスクなどの情報が含まれます。
  • lo: ループバックインターフェースで、主にローカルホスト内でのネットワーク通信テストに使用されます。
  • virbr0: 仮想ネットワークインターフェースで、仮想マシン環境でよく使用されます。

例2: ネットワークインターフェースの無効化

指定したネットワークインターフェースを一時的に無効にします(管理者権限が必要です)。

sudo ifconfig ens37 down

これにより、ens37インターフェースからのネットワーク通信が停止します。

例3: ネットワークインターフェースの有効化

無効化したネットワークインターフェースを再度有効にします(管理者権限が必要です)。

sudo ifconfig ens37 up

これにより、ens37インターフェースが再びネットワーク通信を開始します。

例4: IPアドレスの設定

ネットワークインターフェースにIPアドレスを設定します(管理者権限が必要です)。

sudo ifconfig ens37 192.168.10.100

IPアドレスとサブネットマスクを同時に設定します。

sudo ifconfig ens37 192.168.10.101 netmask 255.255.255.0

これらのコマンドにより、コマンドラインからネットワークインターフェースのIP設定を動的に変更できます。

3.1.2. pingコマンド

pingコマンドは、ネットワーク上のホストとの接続性を確認するために使用されます。これは、ICMPエコー要求パケットを送信し、相手ホストからのICMPエコー応答を待つことで、ネットワークの到達可能性と応答時間を測定します。Windowsのpingコマンドと同じ機能です。

利用可能なユーザー: 全てのユーザー

構文

ping [-dfnqrRv][-c<回数>][-i<間隔秒数>][-I<ネットワークインターフェース>][-l<事前ロード数>][-p<パターン>][-s<データサイズ>][-t<TTL値>][ホスト名またはIPアドレス]

例1: ホストへの接続テスト

www.google.comへの接続性をテストします。

ping www.google.com

出力には、応答時間(time)、TTL値(ttl)、pingシーケンス番号(icmp_seq)などが表示されます。timeの値が小さいほど、ネットワークの応答速度が速いことを示します。

例2: 送信するパケット数を指定

送信するICMPエコー要求パケットの数を-cオプションで指定し、指定回数だけ送信後に自動的に終了させます。

ping -c 4 www.google.com

このコマンドは、4つのパケットを送信した後、自動的に停止します。

pingコマンドは、開発作業において、ローカルマシンとターゲットマシン間のネットワーク接続を確認するための基本的なツールとして頻繁に使用されます。

3.1.3. netstatコマンド

netstatコマンドは、Linuxシステム全体のネットワーク接続、ルーティングテーブル、インターフェース統計などを表示するために使用されます。これにより、システムのネットワーク状態を詳細に把握できます。

利用可能なユーザー: 全てのユーザー

構文

netstat [-acCeFghilMnNoprstuvVwx][-A<ネットワークタイプ>][--ip]

例1: 詳細な接続状況の表示

システム上の全てのアクティブな接続(リッスン状態のソケットを含む)を表示します。

netstat -a

この出力には、例えば0.0.0.0:sshのようなエントリが表示されることがあります。これは、SSHサービスが全てのインターフェース(0.0.0.0)の22番ポート(デフォルトのSSHポート)で接続を待機している(LISTEN状態)ことを示します。

例2: ネットワークインターフェースの統計表示

各ネットワークインターフェースの統計情報を表示します。

netstat -i

これにより、受信パケット数、送信パケット数、エラー数などのインターフェースごとのサマリーが確認できます。

3.2. ディスクコマンド

3.2.1. lsblkコマンド

lsblkコマンド(list block devices)は、システム上の全てのブロックデバイス(ディスク、パーティションなど)の情報をツリー形式で表示します。これらのデバイス間の依存関係も示されますが、RAMディスクの情報は表示されません。

利用可能なユーザー: 全てのユーザー

構文

lsblk [オプション]

例1: デフォルト形式でのブロックデバイス一覧表示

引数なしでlsblkを実行すると、全てのブロックデバイスがツリー形式で表示されます。

lsblk

出力の各列の意味:

  • NAME: デバイス名(例: sda, sda1, sr0)。
  • MAJ:MIN: メジャー番号とマイナー番号(デバイスの識別子)。
  • RM: デバイスがリムーバブルかどうか(1はリムーバブル、0は固定)。
  • SIZE: デバイスの容量。
  • RO: デバイスが読み取り専用かどうか(1は読み取り専用、0は読み書き可能)。
  • TYPE: デバイスの種類(例: disk, part, rom)。
  • MOUNTPOINT: デバイスがマウントされている場所。

例2: ファイルシステム情報の表示

-fオプションを使用すると、ファイルシステムのタイプ(FSTYPE)、UUID、ラベル(LABEL)、マウントポイントなど、より詳細なファイルシステム関連の情報を表示できます。

lsblk -f

3.2.2. dfコマンド

dfコマンド(disk free)は、Linuxシステム上のファイルシステムのディスク使用状況に関する統計情報を表示します。これは、Windowsでディスクのプロパティを確認するのに似ています。

利用可能なユーザー: 全てのユーザー

構文

df [オプション]... [ファイル]...

例1: ディスク使用状況の統計表示

ファイルシステムのディスク使用状況をデフォルトの単位(1Kブロック)で表示します。

df

出力の各列の意味:

  • 1列目: ファイルシステム名。
  • 2列目: 1Kブロック単位での総容量。
  • 「Used」と「Available」列: 使用済み容量と利用可能容量。
  • 「Use%」列: 使用済み容量の割合。
  • 最後の列: ファイルシステムのマウントポイント。

例2: 特定のディレクトリが属するファイルシステムの情報表示

特定のディレクトリが属するファイルシステムのディスク使用状況を表示します。

df /home/user/documents/

例3: 全てのファイルシステムの合計使用量を表示

--totalオプションを使用すると、全てのファイルシステムの使用量の合計行が追加表示されます。

df --total

例4: 人間が読みやすい形式での表示

-hオプション(human-readable)を使用すると、容量をギガバイト(G)、メガバイト(M)、キロバイト(K)などの単位で表示し、より直感的に理解しやすくなります。

df -h

3.2.3. mountコマンド

Linuxシステムでは、USBドライブ、CD-ROM、追加のハードドライブなどの全てのストレージデバイスは、システム上の特定のディレクトリに「マウント」されて初めてアクセス可能になります。この「マウント」は、Windowsでドライブレター(A:, C:など)を割り当てることに似ています。

マウントの概念

Linuxをインストールする際に設定されたルートパーティション(/)や/bootパーティションなどは、自動的にマウントされます。しかし、光ディスクやUSBドライブなどのリムーバブルストレージデバイスは、使用するために手動でマウントする必要があります。

マウントとは、Linuxのルートディレクトリ配下の特定のディレクトリに、外部ファイルシステムを「関連付ける」操作です。このディレクトリを「マウントポイント」と呼びます。関連付けを解除するプロセスは「アンマウント」と呼ばれます。

マウントポイントの要件:

  • マウントポイントとなるディレクトリは事前に存在している必要があります(mkdirコマンドで作成可能)。
  • マウントポイントディレクトリは、他のプロセスによって使用されていない必要があります。
  • マウントポイントのディレクトリに元々ファイルが存在した場合、マウント中はそれらのファイルは隠されます。

利用可能なユーザー: 表示は全てのユーザー、設定変更は管理者権限が必要です。

構文

mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

ここでは、LinuxシステムにCD/DVDドライブをマウントしてその内容を確認する例を考えます。

注意: 一般ユーザーはCD-ROMをマウントできないことが多いため、rootユーザーで操作します。

例1: マウントポイントの作成

rootユーザーとして、/mnt/cdromというマウントポイントディレクトリを作成します。

sudo mkdir -p /mnt/cdrom

例2: CD/DVDドライブのマウント

CD/DVDドライブ(通常/dev/cdromまたは/dev/sr0)を/mnt/cdromにマウントします。

sudo mount -t auto /dev/cdrom /mnt/cdrom

-t autoはファイルシステムタイプを自動検出させます。

例3: マウントポイントの内容確認

マウントが成功したら、/mnt/cdromディレクトリを通してCD/DVDの内容にアクセスできます。

ls -l /mnt/cdrom/

例4: CD/DVDドライブのアンマウント

CD/DVDドライブの使用が終わったら、アンマウントします。

sudo umount /mnt/cdrom/

アンマウント後、/mnt/cdromディレクトリからはCD/DVDの内容が見えなくなります。

まとめ: ユーザーはハードウェアデバイスに直接アクセスすることはできません。ハードウェアデバイスをシステムディレクトリに「マウント」することで、ユーザーはそれらのデバイスにアクセスできるようになります。

4. シェルとパッケージ管理

4.1. yumコマンド

yum(Yellowdog Updater, Modified)は、Fedora、Red Hat、CentOSなどのLinuxディストリビューションで利用される、パッケージ管理のためのシェルフロントエンドツールです。開発ツールにおけるプラグインストアのような役割を果たします。

yumの概念

yumは、ソフトウェアパッケージを検索、インストール、削除、更新するためのコマンド群を提供します。パッケージ間の依存関係を自動的に解決し、操作を簡潔にします。

yumの仕組み

yumは、インターネット経由でリモートの「yumリポジトリ」(yum源)に接続し、そこからパッケージ情報を取得したり、パッケージをダウンロード・インストールしたりします。このため、yumを使用するにはインターネット接続が必要です。

利用可能なユーザー: 管理者権限(sudoまたはroot)が必要です。

構文

yum [オプション] [コマンド] [パッケージ ...]
  • オプション: -h(ヘルプ)、-y(全てのプロンプトに「yes」と応答)、-q(インストールプロセスを非表示)など。
  • コマンド: 実行する操作(例: install, remove, update)。
  • パッケージ: 操作対象のパッケージ名。

yumの主要コマンド

  • yum check-update: 更新可能なパッケージを一覧表示します。
  • yum update: 全てのパッケージを更新します。
  • yum install <package_name>: 指定したパッケージをインストールします。
  • yum update <package_name>: 指定したパッケージのみを更新します。
  • yum list: 全ての利用可能なパッケージを一覧表示します。
  • yum remove <package_name>: パッケージを削除します。
  • yum search <keyword>: 指定したキーワードでパッケージを検索します。
  • yum clean all: 全てのキャッシュ(パッケージ、ヘッダーなど)をクリアします。

4.1.1. treeコマンドのインストール

ディレクトリ構造をツリー形式で表示するtreeコマンドをインストールします。

sudo yum -y install tree

-yオプションは、インストール中に表示される確認プロンプトに自動的に「yes」と応答します。

インストール後、treeコマンドを実行して確認します。

tree

4.1.2. treeコマンドの削除

インストールしたtreeパッケージをシステムから削除します。

sudo yum remove tree

削除後、treeコマンドを実行すると、「command not found」と表示されるはずです。

tree

4.1.3. yumによるパッケージ検索

yum listコマンドとワイルドカードを使って、「apache」で始まるパッケージ名を検索します。

yum list apache*

これにより、「apache」という文字列で始まる全てのパッケージ(例: apache-httpd, apache-tomcatなど)が一覧表示されます。

4.1.4. yumリポジトリの管理

概要

yumは、ソフトウェアパッケージの供給元である「yumリポジトリ」(通称: yum源)に依存します。リポジトリは、インストール可能なパッケージとそのメタデータ(バージョン情報、依存関係など)を保持しています。

デフォルトでは、CentOSのyumは公式のCentOSリポジトリを使用します。

yumリポジトリには様々な種類があり、例えば日本国内にはより高速で安定したミラーサーバー(例: 理研、JAISTなど)が提供されています。

国内ミラー(例: Alibaba Cloud)リポジトリの導入

デフォルトのyumリポジトリは海外のサーバーにあり、ダウンロード速度が遅くなることがあります。国内のミラーリポジトリに切り替えることで、ソフトウェアのダウンロード速度と安定性が向上します。

1. wgetのインストール

まず、リポジトリファイルをダウンロードするためにwgetコマンドをインストールします。

sudo yum -y install wget
2. 既存のCentOS-Base.repoファイルのバックアップ

既存のリポジトリファイルをバックアップしておきます。

cd /etc/yum.repos.d/
sudo mv CentOS-Base.repo CentOS-Base.repo.bak
3. 国内ミラーのリポジトリファイルをダウンロード

例として、Alibaba CloudのCentOS 7用リポジトリファイルをダウンロードします。

sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

注意: URL内のCentos-7.repoが現在のCentOSのバージョンと一致していることを確認してください。

4. yumキャッシュの再構築

新しいリポジトリ情報を反映させるために、既存のキャッシュをクリアし、新しいメタデータを生成します。

sudo yum clean all
sudo yum makecache

yum makecacheは、リポジトリからパッケージ情報を取得し、ローカルにキャッシュすることで、その後のyumコマンドの実行速度を向上させます。

5. 新しいyumリポジトリの使用を確認

パッケージを検索して、新しいリポジトリが使用されていることを確認します。

yum search nginx

出力に「Loading mirror speeds from cached hostfile」とともに、設定したミラーサーバー(例: mirrors.aliyun.com)が表示されれば、切り替えは成功です。

4.2. rpmコマンド

rpm(Red Hat Package Manager)は、Red Hat系のLinuxディストリビューションで利用されるパッケージ管理システムです。Windowsの「プログラムの追加と削除」に似ていますが、より強力な機能を提供します。

rpmの概要

rpmは、Linuxのソフトウェアパッケージを管理するためにRed Hat Linuxで開発されましたが、その機能性と利便性から他のディストリビューションでも採用されています。.rpm拡張子を持つパッケージファイルのインストール、アップグレード、削除、クエリなどの操作を行います。

rpmyumの違い

  • rpmは、既にローカルにダウンロードされた.rpmパッケージファイルのインストールに特化しています。依存関係は自動的に解決しません。
  • yumは、インターネットから.rpmパッケージをダウンロードしてインストールするだけでなく、システム全体の更新や、パッケージ間の依存関係を自動的に解決する機能を持っています。

利用可能なユーザー: 管理者権限(sudoまたはroot)が必要です。

構文

rpm [オプション...]

.rpmパッケージは、Windowsの.exeインストーラーファイルに似ています。

rpmの主要コマンド

  • rpm -ivh <package_file.rpm>: .rpmパッケージをインストールします。
    • -i: インストール
    • -v: 詳細表示
    • -h: 進捗状況をハッシュ記号で表示
  • rpm -e <package_name>: インストール済みのパッケージを削除します。パッケージファイル名ではなく、パッケージ名(例: httpd)を指定します。
  • rpm -qa: システムにインストールされている全てのrpmパッケージを一覧表示します。
  • rpm -qi <package_name>: 指定したパッケージの詳細情報を表示します。
  • rpm -ql <package_name>: 指定したパッケージがインストールしたファイルの一覧とパスを表示します。

4.3. シェルスクリプト

シェルスクリプトは、Linux環境で実行されるコマンドの集合を記述したスクリプトファイルです。Windowsのバッチファイル(.bat)に似ており、例えばTomcatのstartup.shのように、一連のタスクを自動化するために使われます。

4.3.1. シェルスクリプト入門

簡単なシェルスクリプトを作成し、echoコマンドでメッセージを表示する例を通じて、基本的な構造を学びます。

1. シェルとは

シェルスクリプトは、シェル(コマンドラインインタープリタ)のために書かれたプログラムです。LinuxやUnix系OSにおいて、シェルはユーザーとカーネルの間に位置し、コマンドの解釈と実行を行います。

シェルスクリプトはJavaScriptやPHPのようなスクリプト言語と同様に、テキストエディタで記述し、シェルインタープリタによって実行されます。

一般的なLinuxのシェルには、Bourne Shell (/bin/sh)、Bourne Again Shell (/bin/bash)、C Shell (/usr/bin/csh) などがあります。本稿では、広く利用されているデフォルトのシェルであるBash(Bourne Again Shell)を前提とします。

2. シェル環境

システムにインストールされているシェルの一覧は、/etc/shellsファイルで確認できます。

cat /etc/shells

3. 最初のシェルスクリプト作成

hello_world.shというファイル名で以下の内容を記述します。

#!/bin/bash
# これは最初のシェルスクリプトです
echo "こんにちは、シェルスクリプト!"
  • #!/bin/bash: 「Shebang(シバン)」と呼ばれ、このスクリプトを/bin/bashインタープリタで実行することをシステムに指示します。
  • echo "...": 指定された文字列を標準出力に表示します。

作成手順:

1. vimでファイルを作成します。

vim hello_world.sh

2. 上記のスクリプト内容を記述し、保存して終了します(:wq)。

3. ファイルのパーミッションを確認します。

ls -l hello_world.sh

通常、作成直後のファイルには実行権限(x)がありません。

4. 実行権限を付与します。

chmod +x hello_world.sh

5. スクリプトを実行します。

./hello_world.sh

スクリプトが正常に実行され、「こんにちは、シェルスクリプト!」と表示されれば成功です。

4.3.2. シェルスクリプトのコメント

シェルスクリプトでは、コードの説明や一時的な無効化のためにコメントを使用します。

1. 単一行コメント

行の先頭に#を付けると、その行はコメントとして解釈され、シェルインタープリタによって無視されます。

# これは単一行コメントの例です
output_message="Hello" # 行の途中にコメントを記述することも可能

2. 複数行コメント

複数行にわたるコメントを記述するには、ヒアドキュメント形式を利用できます。

:<<'COMMENT_BLOCK'
これは
複数行にわたる
コメントの例です。
COMMENT_BLOCK

COMMENT_BLOCKの部分は任意の文字列(例: EOF, END, ---など)に変更可能です。開始マーカーと終了マーカーは完全に一致している必要があります。

4.3.3. シェル変数の利用

シェルスクリプトでも、値を格納するための変数を定義し、使用することができます。

1. 変数の定義

変数は変数名="値"の形式で定義します。変数名と等号(=)の間にはスペースを入れてはいけません。

my_string="テキストデータ"

変数名の命名規則:

  • 英字、数字、アンダースコア(_)のみ使用可能。
  • 最初の文字は数字であってはいけません。
  • 変数名の中にスペースを含めることはできません。
  • 予約語(例: if, forなど)は使用できません。

有効な変数名の例:MY_VARIABLE, file_count, data2023

無効な変数名の例:1_var (数字で始まる), my var (スペースが含まれる)

2. 変数の使用

定義した変数の値を使用するには、変数名の前にドル記号($)を付けます。

my_variable="Hello Shell"
echo $my_variable
echo ${my_variable}

変数名を波括弧({})で囲むのは必須ではありませんが、変数名と続く文字列を明確に区別したい場合に推奨されます。例えば:

action="download"
echo "ファイルを ${action}ing しています。"

もし$actioningと書くと、シェルはactioningという名前の変数を探してしまいます。

変数は再定義可能です。

user_name="John"
echo "現在のユーザー名: $user_name"
user_name="Jane"
echo "新しいユーザー名: $user_name"

注意: 変数を再定義する際に$user_name="Jane"のようにドル記号を付けてはいけません。ドル記号は変数の「値」を参照する際に使用します。

3. 読み取り専用変数

readonlyコマンドを使用すると、変数を読み取り専用として定義し、その後の変更を防ぐことができます。

#!/bin/bash
system_path="/usr/local/bin"
readonly system_path
system_path="/opt/bin" # この行はエラーになります

このスクリプトを実行すると、system_pathを再定義しようとした行でエラーが発生します。

4. 変数の削除

unsetコマンドで変数を削除できます。削除された変数はそれ以降使用できなくなります。読み取り専用変数は削除できません。

#!/bin/bash
temp_data="一時的な値"
echo "削除前のデータ: $temp_data"
unset temp_data
echo "削除後のデータ: $temp_data" # 何も表示されません

シェル文字列

シェルスクリプトで文字列を扱う際は、単一引用符(')、二重引用符(")、または引用符なしで定義できます。

単一引用符
my_text='これは単一引用符で囲まれた文字列です'
  • 単一引用符内の全ての文字はリテラルとして扱われ、変数展開やエスケープシーケンスは行われません。
  • 単一引用符内に単一引用符を含めることはできません。
二重引用符
my_name="Alice"
greeting="こんにちは、\"$my_name\"さん!\n"
echo -e "$greeting"
  • 二重引用符内では変数展開(例: $my_name)が行われます。
  • エスケープシーケンス(例: \n)も解釈されます。
文字列の連結
first_part="Linux"
second_part="Command"
full_string="$first_part $second_part"
echo "$full_string"
文字列の長さを取得
sample_string="example"
echo ${#sample_string} # 出力: 7
文字列の抽出

文字列の一部を抽出できます。インデックスは0から始まります。

long_string="abcdefghijklmn"
echo ${long_string:2:5} # 出力: cdefg (インデックス2から5文字)

4.3.4. シェル配列

Bashは一次元配列をサポートしており、配列のサイズに制限はありません。

配列の定義

配列は括弧()で囲み、要素をスペースで区切って定義します。

my_array=(element0 element1 element2)

または、個々の要素をインデックスを指定して定義することもできます。

my_array[0]="Apple"
my_array[1]="Banana"
my_array[2]="Cherry"

インデックスは連続している必要はなく、範囲にも制限はありません。

配列の読み取り

配列の要素にアクセスするには、${配列名[インデックス]}の形式を使用します。

echo ${my_array[1]} # 出力: Banana

配列の全ての要素を取得するには、@または*を使用します。

echo ${my_array[@]} # 出力: Apple Banana Cherry

配列の長さを取得

配列の要素数や特定の要素の文字列長を取得できます。

num_elements=${#my_array[@]}
echo "配列の要素数: $num_elements" # 出力: 3

4.3.5. シェル演算子

シェルスクリプトは、算術、関係、ブール、文字列などの様々な演算子をサポートしています。Bashはデフォルトでは直接的な算術演算をサポートしていませんが、exprコマンドや$((...))構文、$[...]構文を利用して行えます。

1. 算術演算子

exprコマンドは、式を評価するために使用されます。

val=`expr 10 + 5`
echo "加算結果: $val" # 出力: 15

注意:

  • exprコマンドを使用する場合、演算子とオペランドの間には必ずスペースが必要です(例: 10 + 5)。
  • 式全体はバッククォート(`)で囲む必要があります。
  • 乗算演算子*は、シェルにとってワイルドカードとして解釈されるため、\*のようにエスケープする必要があります。

以下は、主な算術演算子と、$((...))構文や$[...]構文も使った例です。

#!/bin/bash
num1=20
num2=8

echo "加算: $(( num1 + num2 ))"
echo "減算: $(( num1 - num2 ))"
echo "乗算: $(( num1 * num2 ))"
echo "除算: $(( num1 / num2 ))"
echo "剰余: $(( num1 % num2 ))"

# expr コマンドの使用例
result_expr=`expr $num1 \* $num2`
echo "exprでの乗算結果: $result_expr"

# インクリメント/デクリメント
(( num1++ ))
echo "インクリメント後 num1: $num1"

# $[...]構文
result_bracket=$[ num1 + num2 ]
echo "ブラケット構文での加算結果: $result_bracket"

2. 関係演算子(数値比較)

関係演算子は数値を比較するために使用され、通常[...]または[[...]]内で利用されます。

演算子 説明
-eq 等しい [ $a -eq $b ]
-ne 等しくない [ $a -ne $b ]
-gt より大きい [ $a -gt $b ]
-lt より小さい [ $a -lt $b ]
-ge 以上 [ $a -ge $b ]
-le 以下 [ $a -le $b ]
#!/bin/bash
a_val=15
b_val=25

if [ $a_val -eq $b_val ]; then
   echo "$a_val と $b_val は等しい"
else
   echo "$a_val と $b_val は等しくない"
fi

if [ $a_val -lt $b_val ]; then
   echo "$a_val は $b_val より小さい"
else
   echo "$a_val は $b_val 以上"
fi

3. 文字列演算子

文字列を比較したり、その特性をチェックしたりするために使用されます。

演算子 説明
= 二つの文字列が等しい [ "$str1" = "$str2" ]
!= 二つの文字列が等しくない [ "$str1" != "$str2" ]
-z 文字列の長さがゼロである [ -z "$str1" ]
-n 文字列の長さがゼロでない [ -n "$str1" ]
#!/bin/bash
text1="apple"
text2="banana"
empty_text=""

if [ "$text1" = "$text2" ]; then
   echo "$text1 と $text2 は等しい"
else
   echo "$text1 と $text2 は等しくない"
fi

if [ -z "$empty_text" ]; then
   echo "empty_text は空文字列です"
else
   echo "empty_text は空文字列ではありません"
fi

4. ブール演算子

条件式の組み合わせに使用されます。

演算子 説明
! 論理否定 [ ! $condition ]
-o 論理OR [ $cond1 -o $cond2 ]
-a 論理AND [ $cond1 -a $cond2 ]
#!/bin/bash
val_x=5
val_y=15

if [ $val_x -lt 10 -a $val_y -gt 10 ]; then
   echo "val_x は10未満 AND val_y は10より大きい"
else
   echo "条件は満たされませんでした"
fi

if [ $val_x -lt 3 -o $val_y -gt 20 ]; then
   echo "val_x は3未満 OR val_y は20より大きい"
else
   echo "条件は満たされませんでした"
fi

5. 論理演算子([[...]]構文)

Bashの[[...]]構文内で使用される論理演算子です。

演算子 説明
&& 論理AND [[ $cond1 && $cond2 ]]
|| 論理OR [[ $cond1 || $cond2 ]]
#!/bin/bash
param1=30
param2=70

if [[ $param1 -lt 50 && $param2 -gt 50 ]]; then
   echo "両方の条件が真です"
else
   echo "少なくとも一つの条件が偽です"
fi

if [[ $param1 -lt 10 || $param2 -gt 90 ]]; then
   echo "いずれかの条件が真です"
else
   echo "どちらの条件も偽です"
fi

4.3.6. シェルの制御フロー

シェルスクリプトには、プログラムの実行パスを制御するためのif-elseforwhilecaseなどの構文が用意されています。

1. if

条件が真の場合にコマンドブロックを実行します。

if condition; then
    command1 
    command2
    ...
fi

注意: ifブロックの終了はfiifを逆さにしたもの)で示します。

例: sshプロセスが実行中であれば「SSH daemon is running.」と表示します。

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "SSH daemon is running."; fi

2. if-else

条件が真の場合は最初のブロックを、偽の場合はelseブロックを実行します。

if condition; then
    command1 
    command2
    ...
else
    commandN
fi

例: nonexistent_processプロセスが実行中でなければ「Process not found.」と表示します。

if [ $(ps -ef | grep -c "nonexistent_process") -gt 1 ]; then echo "Process found.";  else echo "Process not found."; fi

3. if-elif-else

複数の条件を順に評価し、最初に真となった条件のブロックを実行します。

if condition1; then
    command1
elif condition2; then 
    command2
else
    commandN
fi

例: 二つの数値変数を比較します。

#!/bin/bash
value_a=10
value_b=20

if [ $value_a -eq $value_b ]; then
   echo "value_a と value_b は等しい"
elif [ $value_a -gt $value_b ]; then
   echo "value_a は value_b より大きい"
elif [ $value_a -lt $value_b ]; then
   echo "value_a は value_b より小さい"
else
   echo "どの条件にも合致しませんでした"
fi

4. forループ

指定されたリストの要素を順に処理します。

for var in item1 item2 ... itemN; do
    command1
    command2
    ...
done

例: 文字のリストを順番に出力します。

for char in X Y Z A B; do
    echo "現在の文字: $char"
done

5. whileループ

条件が真である限り、コマンドブロックを繰り返し実行します。

while condition; do
    command
done

例: 変数が10以下の間、その値を出力し続けます。

#!/bin/bash
counter=1
while(( $counter <= 10 )); do
    echo "カウンターの値: $counter"
    let "counter++"
done

6. case-esac

他の言語のswitch-case文に似ており、変数や式の値に基づいて複数の選択肢から一つを実行します。各ケースは右括弧で始まり、二つのセミコロン(;;)で終了します。esaccaseを逆さにしたもの)で文を閉じます。

case 値 in
パターン1)
    command1
    command2
    ;;
パターン2)
    commandA
    commandB
    ;;
*)
    default_command
    ;;
esac

例: 変数app_nameの値に基づいて異なるメッセージを表示します。

#!/bin/bash
app_name="web_service"

case "$app_name" in
   "data_process") echo "データ処理サービスを実行中"
   ;;
   "web_service") echo "ウェブサービスを起動中"
   ;;
   "db_sync") echo "データベース同期を実行中"
   ;;
   *) echo "不明なアプリケーション"
   ;;
esac

4.3.7. シェル関数

シェル関数は、特定のタスクを実行するための一連のコマンドをまとめたものです。他のプログラミング言語における関数やメソッドと同じ役割を果たします。

関数構文

[ function ] function_name [()]
{
    action;
    [return integer_value;]
}

注意点:

  • 関数はfunction fun_name()または単にfun_name()のいずれの形式でも定義できます。
  • 関数の戻り値はreturnキーワードで明示的に指定できます(0-255の整数値)。returnが指定されない場合、最後のコマンドの終了ステータスが関数の戻り値となります。
  • 関数は使用する前に定義する必要があります。通常、スクリプトの先頭部分で定義されます。
  • 関数を呼び出す際は、関数名のみを使用します。

例1: シンプルな関数の定義と呼び出し

#!/bin/bash

# 関数を定義
display_message() {
    echo "これは最初の関数からのメッセージです!"
}

echo "-----関数実行開始-----"
display_message # 関数を呼び出し
echo "-----関数実行終了-----"

例2: 戻り値を持つ関数の定義

#!/bin/bash

calculate_sum() {
    echo "2つの数字を加算します..."
    echo "最初の数字を入力してください: "
    read num_one
    echo "2番目の数字を入力してください: "
    read num_two
    echo "入力された数字は $num_one と $num_two です!"
    return $((num_one + num_two)) # 加算結果を戻り値として設定
}

calculate_sum # 関数を呼び出し
# 関数の戻り値は $? 変数で取得できます
echo "入力された2つの数字の合計は $? です!"

$?は、直前に実行されたコマンドや関数の終了ステータス(戻り値)を保持する特殊変数です。

タグ: linux シェルスクリプト ファイル管理 ネットワーク管理 ディスク管理

6月11日 22:05 投稿