POSIX互換のシェルスクリプトの作成
bash、dash、ash、その他のPOSIXシェルで動作するポータブルなシェルスクリプトを作成。bashismを回避し、クロスプラットフォーム互換性を確保します。
POSIX Compatibility
詳細な説明
POSIXシェル互換性
スクリプトが#!/bin/shを使用する場合、POSIXシェル仕様に準拠する必要があります。多くのシステム(Debian、Ubuntu)は/bin/shとしてdashを使用しており、Bash固有の機能をサポートしていません。
避けるべき一般的なBashism
| Bashism | POSIX代替 |
|---|---|
[[ condition ]] |
[ condition ] |
[ ]での== |
= |
${var//old/new} |
sedを使用: `echo "$var" |
配列 arr=(a b) |
位置パラメータまたは複数の変数 |
function name |
name() |
source file |
. file |
(( arithmetic )) |
$((arithmetic))またはexpr |
<<<(ヒアストリング) |
`echo "string" |
POSIX準拠のテスト
方法1: dashでテスト
dash ./script.sh
方法2: checkbashismsを使用
checkbashisms ./script.sh
方法3: shellcheckで--shell=shを使用
shellcheck --shell=sh ./script.sh
POSIX安全なパターン
文字列操作:
# ファイル名の拡張子を取得(POSIX)
ext="${filename##*.}"
# ディレクトリ名を取得(POSIX)
dir="${filepath%/*}"
# プレフィックスを削除(POSIX)
base="${var#prefix}"
算術演算:
# POSIX算術
count=$((count + 1))
result=$((a * b + c))
#!/bin/bashを使用するとき
配列、[[ ]]、正規表現マッチング、プロセス置換、その他のBash固有の機能が必要な場合はbashを使用してください。ただし#!/bin/bashまたは#!/usr/bin/env bashで明示的に指定してください。
ユースケース
システム初期化スクリプト、パッケージインストールスクリプト、最小限のDockerイメージ(Alpine/busybox)で実行されるCI/CDパイプライン、異なるUnix系オペレーティングシステム間で動作する必要があるスクリプト。