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系オペレーティングシステム間で動作する必要があるスクリプト。

試してみる — Shell Script Linter

フルツールを開く