コンテンツにスキップ

POSIX Shell

出典: フリー教科書『ウィキブックス(Wikibooks)』

はじめに

[編集]

POSIX Shellは、UNIXおよびUNIX系オペレーティングシステムで標準的に使用されるシェルスクリプト言語です。POSIX(Portable Operating System Interface)標準に準拠しており、さまざまなシステム間で互換性があります。このハンドブックでは、POSIX Shellの基本的な使い方から、高度なスクリプト作成までを解説します。

POSIX Shellの基本概念

[編集]

POSIX Shellとは

[編集]

POSIX Shellは、シェルスクリプトを記述するための標準的な言語です。以下のような特徴を持っています。

  1. 互換性:
    • POSIX Shellは、さまざまなUNIX系システム(*BSD、macOSやLinuxのディストリビューションなど)で動作します。
    • シェルスクリプトの移植性が高く、異なるシステム間で同じスクリプトを利用できます。
  2. シンプルな構文:
    • POSIX Shellは、シンプルで直感的な構文を持ち、初心者でも学びやすいです。
  3. 標準化:
    • POSIX標準に準拠しているため、特定のシェル(例: Bash)に依存しないスクリプトを作成できます。

基本的なシェル操作

[編集]

シェルの起動

[編集]

POSIX Shellは、多くのシステムで/bin/shとして提供されています。シェルを起動するには、ターミナルで以下のコマンドを実行します。

/bin/sh

シェルスクリプトの実行

[編集]

シェルスクリプトは、テキストファイルに記述し、実行権限を付与して実行します。以下は、簡単なシェルスクリプトの例です。

#!/bin/sh
echo "Hello, World!"

スクリプトを実行するには、以下のコマンドを使用します。

chmod +x script.sh
./script.sh

変数とパラメータ

[編集]

変数の定義と使用

[編集]

変数は、値を格納するために使用されます。変数を定義するには、以下のように記述します。

name="Alice"
echo "Hello, $name"

位置パラメータ

[編集]

シェルスクリプトでは、コマンドライン引数を位置パラメータとして使用できます。以下は、位置パラメータの例です。

#!/bin/sh
echo "First argument: $1"
echo "Second argument: $2"

スクリプトを実行するには、以下のコマンドを使用します。

./script.sh arg1 arg2

制御構造

[編集]

条件分岐

[編集]

if文を使用して、条件に基づいて処理を分岐できます。以下は、if文の例です。

#!/bin/sh
if [ "$1" = "hello" ]; then
    echo "Hello, World!"
else
    echo "Goodbye!"
fi

ループ

[編集]

forループやwhileループを使用して、繰り返し処理を行えます。以下は、forループの例です。

#!/bin/sh
for i in 1 2 3 4 5; do
    echo "Number: $i"
done

関数

[編集]

関数の定義と使用

[編集]

関数は、再利用可能なコードブロックを定義するために使用されます。以下は、関数の例です。

#!/bin/sh
greet() {
    echo "Hello, $1"
}

greet "Alice"
greet "Bob"

ファイル操作

[編集]

ファイルの存在確認

[編集]

testコマンドまたは[コマンドを使用して、ファイルの存在を確認できます。以下は、ファイルの存在確認の例です。

#!/bin/sh
if [ -f "file.txt" ]; then
    echo "file.txt exists"
else
    echo "file.txt does not exist"
fi

ファイルの読み取り

[編集]

whileループとreadコマンドを使用して、ファイルの内容を読み取れます。以下は、ファイルの読み取りの例です。

#!/bin/sh
while IFS= read -r line; do
    echo "$line"
done < "file.txt"

高度なスクリプト作成

[編集]

エラーハンドリング

[編集]

set -eを使用して、エラーが発生した場合にスクリプトを終了できます。以下は、エラーハンドリングの例です。

#!/bin/sh
set -e

mkdir /tmp/example
echo "Directory created"

サブシェルの使用

[編集]

サブシェルを使用して、別のシェルプロセスでコマンドを実行できます。以下は、サブシェルの例です。

#!/bin/sh
(cd /tmp && echo "Current directory: $(pwd)")
echo "Original directory: $(pwd)"

シェル組み込みコマンド

[編集]

POSIX Shellには、以下のような組み込みコマンドがあります。これらのコマンドは、シェルスクリプト内で頻繁に使用されます。

alias

[編集]

コマンドのエイリアス(別名)を定義します。

alias ll='ls -l'
ll

bg

[編集]

バックグラウンドでジョブを再開します。

sleep 100 &
bg

cd

[編集]

現在のディレクトリを変更します。

cd /tmp

command

[編集]

組み込みコマンドや関数ではなく、外部コマンドを実行します。

command ls

false

[編集]

常に失敗(終了ステータス1)を返します。

false
echo $?  # 1

fc

[編集]

コマンド履歴を編集または再実行します。

fc -l  # コマンド履歴を表示

fg

[編集]

フォアグラウンドでジョブを再開します。

sleep 100 &
fg

getopts

[編集]

スクリプトのオプションを解析します。

#!/bin/sh
while getopts "a:b:" opt; do
    case $opt in
        a) echo "Option a: $OPTARG" ;;
        b) echo "Option b: $OPTARG" ;;
        *) echo "Invalid option" ;;
    esac
done

hash

[編集]

コマンドのパスをハッシュテーブルに保存します。

hash -r  # ハッシュテーブルをリセット

jobs

[編集]

バックグラウンドジョブの一覧を表示します。

sleep 100 &
jobs

kill

[編集]

プロセスにシグナルを送信します。

kill -9 PID

newgrp

[編集]

新しいグループでシェルを起動します。

newgrp groupname

pwd

[編集]

現在のディレクトリを表示します。

pwd

read

[編集]

標準入力から読み取ります。

read name
echo "Hello, $name"

true

[編集]

常に成功(終了ステータス0)を返します。

true
echo $?  # 0

umask

[編集]

ファイル作成時のデフォルトのパーミッションを設定します。

umask 022

実用的なスクリプト例

[編集]

ログファイルの監視

[編集]

以下のスクリプトは、ログファイルを監視し、新しい行が追加されたら表示します。

#!/bin/sh
tail -f /var/log/syslog

バックアップスクリプト

[編集]

以下のスクリプトは、指定したディレクトリをバックアップします。

#!/bin/sh
backup_dir="/backup"
source_dir="/home/user"

tar -czf "$backup_dir/backup_$(date +%Y%m%d).tar.gz" "$source_dir"
echo "Backup completed"

おわりに

[編集]

POSIX Shellは、UNIX系システムで広く使用されるシェルスクリプト言語です。このハンドブックが、POSIX Shellの基本的な操作から高度なスクリプト作成までを理解する一助となれば幸いです。POSIX Shellを活用して、効率的なシステム管理や自動化を行ってください。

参考資料

[編集]

下位階層のページ

[編集]