シェルコマンドとシェルスクリプト


デフォルトシェルの比較

Debian/Ubuntu

DebianとUbuntuのデフォルトのインタラクティブシェルはBashです12。ただし、非インタラクティブシェル(スクリプト実行用)のデフォルトはDashです。これは、/bin/shがDashへのシンボリックリンクになっているためです。

MacOS

MacOSはバージョン10.15 (Catalina) 以降、デフォルトシェルをBashからZshに変更しました。これは主にライセンスの問題によるものです。

シェルコマンドの引数

  1. 引数の順序:多くのコマンドで順序は重要です。一般的に、オプションが先で、操作対象のファイルやディレクトリが後に来ます。
  2. オプション付き引数:
    • 短いオプション: -f value
    • 長いオプション: --file=value または --file value

引数の渡し方とエラー処理

#!/bin/bash

# 引数のチェック
if [ $# -lt 2 ]; then
    echo "Usage: $0 <arg1> <arg2>"
    exit 1
fi

# 引数の使用
arg1="$1"
arg2="$2"

# エラー処理
if ! command -v somecommand &> /dev/null; then
    echo "Error: somecommand is not installed"
    exit 1
fi

# コマンド実行とエラーチェック
if ! somecommand "$arg1" "$arg2"; then
    echo "Error: somecommand failed"
    exit 1
fi

最近の傾向

  1. [[]] の使用: if [[ $var == "value" ]]
  2. $(command) の使用: result=$(ls -l)
  3. ヒアドキュメントの活用:
   cat <<EOF > file.txt
   content
   EOF

シェルスクリプトの書き方と実行

  1. スクリプトの作成:
   #!/bin/bash
   echo "Hello, World!"
  1. 実行権限の付与:
   chmod +x script.sh
  1. 実行:
   ./script.sh

パーミッションの解説

3桁表記

  • 例: 755
  • 各桁: ユーザー、グループ、その他
  • 値: 4(読み取り) + 2(書き込み) + 1(実行)

4桁表記

  • 例: 0755
  • 最初の桁: 特殊な権限(setuid, setgid, sticky bit)
  • 残りの3桁: 3桁表記と同じ

パーミッション変更コマンド

chmod 755 file.sh  # 数字による指定
chmod u+x file.sh  # シンボルによる指定

このように、シェルスクリプトの基本から高度な使用法まで幅広くカバーしています。パーミッションの理解は特に重要で、セキュリティと適切なファイル管理に不可欠です。

パーミッションの2進数表現

パーミッションは実際には3ビットの2進数で表現され、それを10進数に変換しています。

  • 読み取り (r) = 4 (100 in binary)
  • 書き込み (w) = 2 (010 in binary)
  • 実行 (x) = 1 (001 in binary)

これらを組み合わせることで、0から7までの数字で表現できます:

  • 0 = — (000 in binary)
  • 1 = –x (001 in binary)
  • 2 = -w- (010 in binary)
  • 3 = -wx (011 in binary)
  • 4 = r– (100 in binary)
  • 5 = r-x (101 in binary)
  • 6 = rw- (110 in binary)
  • 7 = rwx (111 in binary)

例えば、パーミッション755は以下を意味します:

  • ユーザー: rwx (111 in binary = 7)
  • グループ: r-x (101 in binary = 5)
  • その他: r-x (101 in binary = 5)

特殊なパーミッション:setuid、setgid、sticky bit

これらの特殊なビットは、通常のパーミッションの前に4桁目として表現されます。

  1. setuid (4):
  • ファイルに対して設定すると、そのファイルは所有者の権限で実行されます。
  • 例:chmod 4755 file
  1. setgid (2):
  • ファイルに設定すると、グループの権限で実行されます。
  • ディレクトリに設定すると、その中に作成されるファイルは親ディレクトリのグループを継承します。
  • 例:chmod 2755 directory
  1. sticky bit (1):
  • ディレクトリに設定すると、その中のファイルは所有者かroot以外が削除できなくなります。
  • 例:chmod 1755 directory

これらを組み合わせることも可能です。例えば、chmod 7755 fileは、setuid、setgid、sticky bitすべてを設定します。

これらの特殊なビットは、セキュリティと共同作業の管理に重要な役割を果たします。setuidとsetgidは特定のプログラムに一時的に高い権限を与えるのに使用され、sticky bitは共有ディレクトリでのファイル削除を制御するのに使用されます34567

testコマンドと[]の関係

  1. testコマンド
    testは条件を評価するためのUNIXコマンドです。
  2. []の使用
    []testコマンドの組み込みバージョンで、より読みやすい構文を提供します。

例えば、以下の2つの表現は同等です:

if test -f file.txt; then
    echo "file.txt exists"
fi

if [ -f file.txt ]; then
    echo "file.txt exists"
fi

test[]の特徴

  • 両者は機能的に同じです。
  • []の方が視覚的に分かりやすいため、シェルスクリプトでよく使用されます。
  • []を使用する場合、開き括弧と閉じ括弧の両方にスペースが必要です。

[[]]との違い

先ほど触れた[[]]は、[]のさらに拡張された形式です。

  • [[]]はBashの拡張機能で、POSIXには準拠していません。
  • [[]]はより柔軟な構文を提供し、文字列比較やパターンマッチングが容易です。

例:

# []を使用
if [ "$a" = "$b" ]; then
    echo "Strings are equal"
fi

# [[]]を使用
if [[ $a == $b ]]; then
    echo "Strings are equal"
fi

[[]]では、変数の引用符が不要で、==演算子が使用可能です。

まとめ

  • test[]は基本的に同じ機能を持ちます。
  • []testの別の構文で、より読みやすいです。
  • [[]]はさらに拡張された形式で、Bashなどの特定のシェルでのみ使用可能です。

シェルスクリプトを書く際は、使用するシェルの種類や、スクリプトの移植性を考慮して、適切な形式を選択することが重要です。POSIXに準拠したスクリプトを書く場合はtest[]を使用し、Bashの機能を最大限に活用したい場合は[[]]を使用するのが一般的です。

  1. Shell ↩︎
  2. How to change your default shell in debian ubuntu ↩︎
  3. How Do I Set Up Setuid, Setgid, and Sticky Bits on Linux? ↩︎
  4. Linux File Permissions: Understanding setuid, setgid, and the Sticky Bit ↩︎
  5. Linuxの権限について解説。setuidとかsetgidとかスティッキービットとか ↩︎
  6. SetUID, SetGID, and Sticky Bits in Linux File Permissions ↩︎
  7. How to use special permissions: the setuid, setgid and sticky bits ↩︎